为什么说有的浮点数无法精确的表示呢?

combobox2013 2013-02-28 09:56:25
为什么说有的浮点数无法精确的表示呢?

比如存储10进制0.1,为什么无法保证每一台机子对其存储的值不一样呢?

0.1

0.2 0 0.2
0.4 0 0.4
0.8 0 0.8
1.6 1 0.6
1.2 1 0.2
0.4 0 0.4
0.8 0 0.8
1.6 1 0.6
1.2 1 0.2

二进制:
0.0001 1001 1001 1001 .... 1001

1.1001 1001 1001...1001*2^-4

符号位:0
阶码:-4+127=123 0111 1011

0011 1101 1100 1100 1100 1100 1100 1101

3 d c c c c c c

即:0x3d cc cc cc

每一台机子里的值都是0x3d cc cc cc

不都一样吗?
不是吗








...全文
1084 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2013-03-01
  • 打赏
  • 举报
回复
引用 8 楼 zrdongjiao 的回复:
引用 5 楼 FancyMouse 的回复:引用 3 楼 combobox2013 的回复:引用 1 楼 luciferisnotsatan 的回复:浮点数结构,可以看IEEE754 float val=0.1f; printf("0x%x",val); return 0; 0xa0000000请按任意键继续. . . 的结果和内存中观察的结果不一致……
printf看到%f也是当做double打印的。也就是说printf不区分%f和%lf。scanf是区分的。 >按照这个说法,printf打印float浮点数 的十六进制, 岂不是很危险,结果显示是错误的,因为已经被push了 double了 是 你的情况需要printf("%x", *(int*)(&val));
nice_cxf 2013-03-01
  • 打赏
  • 举报
回复
引用 10 楼 zrdongjiao 的回复:
引用 9 楼 nice_cxf 的回复:比如存储10进制0.1,为什么无法保证每一台机子对其存储的值不一样呢? 如果说每台机器存贮浮点数的格式都是iee754,这个说法显然是错的,必然是一样的 那为什么 6楼,7楼,说无法精确的表示, 而且这种答案,很多帖子里都复制粘贴过去。 计算机里的数字都一样,他们想什么呢
无法精确表示和不同机器值不一样不是一回事,很多数的确是无法精确表示,你可以自己查一下iee754格式
zrdongjiao 2013-03-01
  • 打赏
  • 举报
回复
引用 9 楼 nice_cxf 的回复:
比如存储10进制0.1,为什么无法保证每一台机子对其存储的值不一样呢? 如果说每台机器存贮浮点数的格式都是iee754,这个说法显然是错的,必然是一样的
那为什么 6楼,7楼,说无法精确的表示, 而且这种答案,很多帖子里都复制粘贴过去。 计算机里的数字都一样,他们想什么呢
nice_cxf 2013-03-01
  • 打赏
  • 举报
回复
比如存储10进制0.1,为什么无法保证每一台机子对其存储的值不一样呢? 如果说每台机器存贮浮点数的格式都是iee754,这个说法显然是错的,必然是一样的
zrdongjiao 2013-03-01
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
引用 3 楼 combobox2013 的回复:引用 1 楼 luciferisnotsatan 的回复:浮点数结构,可以看IEEE754 float val=0.1f; printf("0x%x",val); return 0; 0xa0000000请按任意键继续. . . 的结果和内存中观察的结果不一致啊 float给push到printf的堆……
按照这个说法,printf打印float浮点数 的十六进制, 岂不是很危险,结果显示是错误的,因为已经被push了 double了. 还有printf一个doulbe的十六进制也是错误的, 只有低4个字节可以打印。 如何解决呢? spritnf也解决不了打印一个浮点数的十六进制
Athenacle_ 2013-02-28
  • 打赏
  • 举报
回复
赵老师说过,十进制小数无法精确表示 三分之一, 同理,二进制小数也无法精确表示 十分之一。
FancyMouse 2013-02-28
  • 打赏
  • 举报
回复
引用 3 楼 combobox2013 的回复:
引用 1 楼 luciferisnotsatan 的回复:浮点数结构,可以看IEEE754 float val=0.1f; printf("0x%x",val); return 0; 0xa0000000请按任意键继续. . . 的结果和内存中观察的结果不一致啊
float给push到printf的堆栈的时候会转成double……你看到的是(double)0.1的高32位或者低32位……
luciferisnotsatan 2013-02-28
  • 打赏
  • 举报
回复
1.1 - 1.0 和 2.1 - 2.0 是否一致,然后3.1,4.1等等?浮点数是要用来计算的。
combobox2013 2013-02-28
  • 打赏
  • 举报
回复
引用 1 楼 luciferisnotsatan 的回复:
浮点数结构,可以看IEEE754
float val=0.1f; printf("0x%x",val); return 0; 0xa0000000请按任意键继续. . . 的结果和内存中观察的结果不一致啊
combobox2013 2013-02-28
  • 打赏
  • 举报
回复
引用 1 楼 luciferisnotsatan 的回复:
浮点数结构,可以看IEEE754
我已经按照这个标准手工求解出结果来了
luciferisnotsatan 2013-02-28
  • 打赏
  • 举报
回复
浮点数结构,可以看IEEE754
赵4老师 2013-02-28
  • 打赏
  • 举报
回复
引用 6 楼 Athenacle_ 的回复:
赵老师说过,十进制小数无法精确表示 三分之一, 同理,二进制小数也无法精确表示 十分之一。
用10进制小数不能精确表示某些三进制小数0.1(3)=0.33333333333……(10) 同理,用二进制小数也不能精确表示某些10进制小数。
前导课程:      《Java工程师系列课程》前4部课程内容:       本课程是《Java工程师系列课程》的第7部分,主要讲解Java实际开发过程中常用类,特别是各种工具类的使用。熟练掌握这些类的使用方法,能够大幅度提高编程效率。同时还在课程中穿插讲解了很多Java语言的设计思想和理念,深刻理解并掌握这些编程思想能够从根本上提高编程水平和解决问题的能力。在课程的末尾还安排了国际化软件实战项目。       本课程涉及的主要内容如下表所示:课程明:      在开发Java程序的过程中,无论做什么类型的项目,都会用到各种工具类来解决一些实际问题。这些工具类被广泛的应用与各种行业软件的开发。比如我们经常会用BigDecimal类来的完成浮点数精确计算,也会用Formatter类完成文本、数字、日期的格式化操作等等。      为了能够让学员迅速掌握这些工具类的使用,我们特意开发了这门视频课程,视频中详细讲解了20余种常用工具类的使用规则。此外,在课程中,还讲解了很多Java语言的设计思想和理念,可以让学员在听课过程中能够对Java语言有更加深刻的理解和认识。      最后,本课程还安排了一个小型国际化软件的实战项目,通过实战让学员掌握国际化软件的开发理念和实际操作流程预期效果:      认真学习完本课程,学员可以掌握20种Java实战开发中常用类的使用方法,实实在在提高实战水平,完成从菜鸟到高手的华丽转变。配套福利:中英文双语版本自助购物软件的完整源码环境配置要求:      学习本课程需安装JDK13或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。     因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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