浮点数不考虑精度的情况下到底能表达多少位小数点?我读出了1022位

BAO BAO 2017-11-12 01:13:23
我用的gcc -std=c99 编译的
第一:我发现c99下读取浮点能读取超过17位的数据,非c99是读取不了这么多的
第二:一直迷惑ieee754到底说没说 最多能放下多少位小数点,

double a=0.1;
我打印输出内存中的数据是:0.1000000000000000055511151231257827021181583404541015625
也就这么多位了 在增加宽度 后面的就都显示0了。我以为这就很长了,但我刚才测试了下float.h中的DBL_MAX和DBL_MIN
先说DBL_MIN我测试了好几次 直到打印宽度1022才算输出完,能有这么多?double就8字节能装下了?
我在国外的一个网站也看到了一个人说 DBL_MIN有1022位 他也是gcc编译的 是在ubuntu下
You can also see that DBL_MIN, the smallest positive normalized double value, has 1022 digits in the fractional part and of those there are 715 significant digits.

先别说什么有意义无意义 这个值我试过 单独赋值给一个新的double变量 再去读取 还能准确完整读取的。
只要能精确存储的浮点小数 都能精确读取,能精确读取存放的原数据就是有意义

我的疑问是:
1.为什么gcc 下使用c99编译 能读取浮点这么多位,c99对浮点操作方面 是有啥改变的吗?不用c99就读取不了这么多位。
2.不考虑有效精度,浮点数到底能表示多少位小数?



...全文
408 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CT8100 2017-11-15
  • 打赏
  • 举报
回复
不考虑精度。。。那读它做什么
ckc 2017-11-14
  • 打赏
  • 举报
回复
引用 4 楼 wqte45 的回复:
[quote=引用 1 楼 ckc 的回复:] 能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度
能精确表示的浮点是没有那么多位的 比如 0.5 0.25 1.0 输多少后面都是0 因为其二进制能准确存放在内存中 现在讨论的是 打印出 不能准确用二进制表达的浮点小数 在内存中的完整表达 不考虑精度 就是8字节内存里的数据 有多少打印多少位[/quote] 你似乎没仔细看我的帖子。 我的意思是你试下处理类似1.000000000000000000000000000000000000000000000000000000000000000000000001这样的数据 看看能不能正常处理,甚至把这个数再加上0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001这样,看看能不能正常输出,如果可以,那就是精度确实够了,如果不行,那就只是输出了这么多位,实际精度达不到
paschen 2017-11-13
  • 打赏
  • 举报
回复
引用 5 楼 那年那人的回复:
[quote=引用 2 楼 paschen 的回复:]
DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数,其次你输出看到的非0数字并不等于代表实际表示到了的位数,double通常能表示的有效位数大约是15位,因为double有52位用于存放尾数,加一个隐含位,共 53个二进制有效位位数,2^53次方有15个十进制位,超出这个范围后面的你看到的都是假的


我前提都说了 不说有效精度 有效精度是指有精确保障的位数, 浮点数本来就不是精确的,
既然能输出了这么多位 就证明在double的8字节内存里。存放的有数据
再次说明 不考虑什么有效无效 现在不是求有效精度 是说double最大能表达多少位 你说的15位那是可以准确表达 无失真的位数 后面的由于精度限制 可能就失真了。但只要有数值 就算是有 我的问题是不考虑精度 能表达的数字是多少位?
反正是这个变量8字节里输出的 肯定不会输出到后面的字节


[/quote] 那取决于printf的具体实现,而不是double怎么存,你要研究可以单步跟踪到printf里一探究竟
paschen 2017-11-12
  • 打赏
  • 举报
回复
另可参看float.h中的DBL_DIG这个宏定义
paschen 2017-11-12
  • 打赏
  • 举报
回复
DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数,其次你输出看到的非0数字并不等于代表实际表示到了的位数,double通常能表示的有效位数大约是15位,因为double有52位用于存放尾数,加一个隐含位,共 53个二进制有效位位数,2^53次方有15个十进制位,超出这个范围后面的你看到的都是假的
ckc 2017-11-12
  • 打赏
  • 举报
回复
能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度
赵4老师 2017-11-12
  • 打赏
  • 举报
回复
BAO BAO 2017-11-12
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数,其次你输出看到的非0数字并不等于代表实际表示到了的位数,double通常能表示的有效位数大约是15位,因为double有52位用于存放尾数,加一个隐含位,共 53个二进制有效位位数,2^53次方有15个十进制位,超出这个范围后面的你看到的都是假的


我前提都说了 不说有效精度 有效精度是指有精确保障的位数, 浮点数本来就不是精确的,
既然能输出了这么多位 就证明在double的8字节内存里。存放的有数据
再次说明 不考虑什么有效无效 现在不是求有效精度 是说double最大能表达多少位 你说的15位那是可以准确表达 无失真的位数 后面的由于精度限制 可能就失真了。但只要有数值 就算是有 我的问题是不考虑精度 能表达的数字是多少位?
反正是这个变量8字节里输出的 肯定不会输出到后面的字节


BAO BAO 2017-11-12
  • 打赏
  • 举报
回复
引用 1 楼 ckc 的回复:
能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度
能精确表示的浮点是没有那么多位的 比如 0.5 0.25 1.0 输多少后面都是0 因为其二进制能准确存放在内存中 现在讨论的是 打印出 不能准确用二进制表达的浮点小数 在内存中的完整表达 不考虑精度 就是8字节内存里的数据 有多少打印多少位

69,373

社区成员

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

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