a very very simple question,单精度浮点数怎么确定上下限的?

2016-09-24 17:45:37 +08:00
 Newyorkcity
就谈论正数好了.
网上说正数的时候是从 1.401298E-45 到 3.402823E38
我所学到的知识是 32 位中 1 位用来标记正负,在第一位,后八位用来表示指数,为避免错误指数八位把-127 到 127 在数轴上向右平移 127 得到 0-254 (不过话说 11111111 是 255 啊,不允许使用么?)
并且,在处理浮点数时默认剩下的尾数部分( 23 位)是从 2^(-1)开始的,整数部分已经被自动看做 1.
所以我认为整数单精度浮点数的最小值应该为
1.0 * 2 ^ (-127)
但这个答案是
5.8774717541114375398436826861112e-39 (十进制)
完全不一样啊..
请问单精度浮点数的上下限是怎么样的?
为什么我的想法是错误的?
谢谢.
1418 次点击
所在节点    问与答
6 条回复
akira
2016-09-24 18:17:03 +08:00
那个,你用计算器算下 2 ^ (-127) 是多少?
skydiver
2016-09-24 18:31:06 +08:00
( 2 ) E 全为 0 。这时,浮点数的指数 E 等于 1-127 (或者 1-1023 ),有效数字 M 不再加上第一位的 1 ,而是还原为 0.xxxxxx 的小数。这样做是为了表示±0 ,以及接近于 0 的很小的数字。

你漏掉了指数 E 为 0 的特殊情况。
skydiver
2016-09-24 18:33:05 +08:00
@skydiver 所以最小的大于 0 的数就变成了
2^(-22) * 2^(-127) = 2^(-149) = 1.401298E-45
YuJianrong
2016-09-24 23:01:13 +08:00
@skydiver subnormal 形态是 0.xxx 主要原因是为了避免数字在下降过程中突然降到 0 ,不是为了±0 的表示。

https://zh.wikipedia.org/wiki/IEEE_754#.E9.9D.9E.E8.A7.84.E7.BA.A6.E5.BD.A2.E5.BC.8F.E7.9A.84.E6.B5.AE.E7.82.B9.E6.95.B0
Newyorkcity
2016-09-25 09:50:16 +08:00
@skydiver 也就是说单精度浮点数允许出现 0.x 的情况么?并且允许也只允许出现于 e-127 时?
@akira
我用计算器得到的结果是 5.8774717541114375398436826861112e-39
YuJianrong
2016-09-25 19:31:34 +08:00
@Newyorkcity 0.x 的模式叫 subnormal 模式的浮点数,你可以去查一下 IEEE754 标准的浮点数定义

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/308704

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX