double与int的隐藏类型转问题

ylhyh 2004-09-20 12:15:44
#include <iostream>
using namespace std;

void main()
{
double v1,v2,v3;
int v4;
v1=112;
v2=1.12;
v3=v1/v2;
v4=v3;
cout<<v3<<endl;
cout<<v4<<endl;
}

在上面的这段程序的输出结果是:
100
99

高手解释一下把V3赋给V4的时候精度在那里丢了?

...全文
220 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylhyh 2004-09-22
  • 打赏
  • 举报
回复
先结了再说,谢谢各位,不明白的我再问
idleguy 2004-09-21
  • 打赏
  • 举报
回复
IEEE的存储方式说起来会很多,你到这里看看吧。
http://blog.csdn.net/fireseed/archive/2004/05/25/2180.aspx
奶油写过的一篇文章。那里面是对32位浮点的说明。
IEEE 64bit float和那个方法一样,只是指数位是11bits,尾数是52bits.


因为前几天在折腾IBM float format和IEEE float format之间的转换。对这些还有一点心得。
如果有问题,请发论坛消息给我。很乐意帮忙,
lsdkzkald 2004-09-21
  • 打赏
  • 举报
回复
感觉是不同的编程器实现不同。

ylhyh 2004-09-21
  • 打赏
  • 举报
回复
书桌,你所用的IEEE数据表示方式,不明白,能不能解释一下?
ylhyh 2004-09-20
  • 打赏
  • 举报
回复
另外请教 Leaf_jo(大肥羊) :
用VC.NET做出来了程序在运行时要不要.Net FrameWork?
idleguy 2004-09-20
  • 打赏
  • 举报
回复
精度是不是在另外的4个字节中丢掉了?
编译器好像对于double/float转到int是截掉小数部分。

下面是我进行的一系列转换。不知道对不对。
double v1=112;(IEEE 下同):0x405c000000000000

double v2=1.12;0x3ff1eb851eb851ec.实际上是1.1200000000000001

double v1/v2;结果并不是100,而是99.999999999999986.即0x4058ffffffffffff.
将结果化为2进制:
0100 0000 0101 1000 1111...48个1
所以,指数是10000000101:1029 所以指数是6.(1029-1023)

尾数:1000 1111...48个1.

将小数点右移6位,100011.11111111....
前面补1
1100011.111111...
直接去掉小数部分剩下1100011
这个就是转之后的int.当然最开始符号位是0。
01100011=99


ylhyh 2004-09-20
  • 打赏
  • 举报
回复
我用VS6的环境,单步执行时监控如下:
V1:112.00000000000
V2:1.1200000000000
V3:100.00000000000
赋值前V4:-858993460
赋值后V4:99(V3不变)

难道显示的值跟CPU内部实际处理的值不一样?
Leaf_jo 2004-09-20
  • 打赏
  • 举报
回复
我用的是VC.net。
v3的真实值是99.999999999999986。
注意,对浮点数的输出不是简单截断的,因此cout<<v3<<endl;输出的是100。
而将v3付给v4的时候则截断了小数部分。
daylove 2004-09-20
  • 打赏
  • 举报
回复
就是给v4赋值的那一行呀:

v4=v3;

编译器提示:从“double”转换到“int”,可能丢失数据
ylhyh 2004-09-20
  • 打赏
  • 举报
回复
如果V3是99.9999的话,为什么把它原样输出的时候就是100
ma100 2004-09-20
  • 打赏
  • 举报
回复
因为v3可能是99.999
daylove 2004-09-20
  • 打赏
  • 举报
回复
win32控制台的程序不需要

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧