免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sabrisu
打印 上一主题 下一主题

小问题:输出1.0/3.0*3结果等于1.000000? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-08-23 15:40 |只看该作者
二进制存储,0.33333333用二进制怎么表示?

论坛徽章:
0
12 [报告]
发表于 2012-08-23 15:41 |只看该作者
四舍五入了

1/3的结果是0.3333333333...
再乘以3的结果是0.999999999...

printf的时候被四舍五入。详情见glibc源码里的stdio_common/printf_fp.c。

论坛徽章:
0
13 [报告]
发表于 2012-08-23 15:50 |只看该作者
aychxm 发表于 2012-08-23 15:40
二进制存储,0.33333333用二进制怎么表示?


规格化表示为:阶码是0,尾数是0x55555555 0x55555555 ...

乘以3以后:阶码是0,尾数是0xFFFFFFFF 0xFFFFFFFF ...

After rounding:阶码为1,尾数为0x1 0x00000000 0x00000000 ...

论坛徽章:
0
14 [报告]
发表于 2012-08-23 15:53 |只看该作者
不好意思,rounding是在printf的时候进行,不会在二进制数上进行。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
15 [报告]
发表于 2012-08-23 16:50 |只看该作者
编译器优化的结果。

论坛徽章:
0
16 [报告]
发表于 2012-08-23 18:17 |只看该作者
IEEE754
差不多就是1上下一丢丢。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2012-08-23 19:17 |只看该作者
      15楼已经说出答案了, 编译器已经将 1.0/3.0 * 3 给优化过了, 因为这几个都是确定的数字, 编译器做优化很正常.

如果觉得不确定的话, 可以用objdump把二进制给反汇编出来.

论坛徽章:
1
丑牛
日期:2013-09-29 19:04:50
18 [报告]
发表于 2012-08-23 20:42 |只看该作者
怪不得以前我们领导说做除法的时候要特别小心

论坛徽章:
0
19 [报告]
发表于 2012-08-23 21:09 |只看该作者
回复 11# aychxm


    都不存储0.3333......的好吧。知道什么叫常量表达式不?

论坛徽章:
0
20 [报告]
发表于 2012-08-23 21:10 |只看该作者
回复 1# sabrisu


    1.0000000和1不是一个东西
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP