一道关于类型转换的基础题,挺奇怪的

sujinzhao407 2011-03-18 03:10:38
程序代码如下:

float step = 0.2;
cout << "1.0/step = " << 1.0/step << endl;
cout << "unsigned(1.0/step) = " << (unsigned)(1.0/step) << endl;

用g++编译器在Ubuntu 10.04下运行结果如下:
1.0/step = 5
unsigned(1.0/step) = 4

自己想不通,求原因?
...全文
77 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsjliuxing 2011-03-18
  • 打赏
  • 举报
回复
这不是类型转换的问题...

0.2用浮点数是不能精确表示的,所以编译器要么把它翻译成最大的0.2小的float类型值要么是最小的比0.2大的float类型值。(这里显然是前者)

然后1.0 / step结果就会比5小一点,直接去整显然是4。但是如果你把它作为浮点数输出,cout会进行四舍五入操作,所以输出5

???
bluewanderer 2011-03-18
  • 打赏
  • 举报
回复
更正这里编译器是处理成最小的比0.2大的float类型值,类似于2.000001
bluewanderer 2011-03-18
  • 打赏
  • 举报
回复
这不是类型转换的问题...

0.2用浮点数是不能精确表示的,所以编译器要么把它翻译成最大的0.2小的float类型值要么是最小的比0.2大的float类型值。(这里显然是前者)

然后1.0 / step结果就会比5小一点,直接去整显然是4。但是如果你把它作为浮点数输出,cout会进行四舍五入操作,所以输出5
sujinzhao407 2011-03-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bluewanderer 的回复:]

这个时编译器在编译的时候是把0.2处理成0.1999999....还是2.000001...的问题...
[/Quote]

那我的编译器就只能将0.2按两者之一存储吧,不能一会是0.1999,一会又是2.001,因为直接转成整数的话是4,但保存成float的话是5,这就表明编译器对同一个值有两种保存形式?
sujinzhao407 2011-03-18
  • 打赏
  • 举报
回复
问题补充:

int tmp1 = 1.0/step;
float tmp2 = 1.0/step;
cout << "tmp1 = " << tmp1 << ", tmp2 = " << tmp2 << endl;
for(int i = 1; i <= int(float(1.0/step)); i++)
cout << i << endl;

结果如下:
tmp1 = 4, tmp2 = 5
1
2
3
4

貌似是类型转换出了问题,但将相除的结果直接转成整形应该没问题啊,因为是整除没有小数的问题,但如果我不想通过一个float类型变量,而直接将表达式用到for循环中,那么相除的结果一直为4,求原因??
bdmh 2011-03-18
  • 打赏
  • 举报
回复
这是浮点数的特殊存储造成的,你看到的结果是5,但是内存中可能是4.999999或者5.00000001,恰好你的是4.9999999,这样转换成整形后就是取整,为4
bluewanderer 2011-03-18
  • 打赏
  • 举报
回复
这个时编译器在编译的时候是把0.2处理成0.1999999....还是2.000001...的问题...

64,685

社区成员

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

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