V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2016-09-24 17:45:37 +08:00 · 1483 次点击
    这是一个创建于 3000 天前的主题,其中的信息可能已经有所发展或是发生改变。
    就谈论正数好了.
    网上说正数的时候是从 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 (十进制)
    完全不一样啊..
    请问单精度浮点数的上下限是怎么样的?
    为什么我的想法是错误的?
    谢谢.
    6 条回复    2016-09-25 19:31:34 +08:00
    akira
        1
    akira  
       2016-09-24 18:17:03 +08:00
    那个,你用计算器算下 2 ^ (-127) 是多少?
    skydiver
        2
    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
        3
    skydiver  
       2016-09-24 18:33:05 +08:00   ❤️ 1
    @skydiver 所以最小的大于 0 的数就变成了
    2^(-22) * 2^(-127) = 2^(-149) = 1.401298E-45
    YuJianrong
        4
    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
        5
    Newyorkcity  
    OP
       2016-09-25 09:50:16 +08:00
    @skydiver 也就是说单精度浮点数允许出现 0.x 的情况么?并且允许也只允许出现于 e-127 时?
    @akira
    我用计算器得到的结果是 5.8774717541114375398436826861112e-39
    YuJianrong
        6
    YuJianrong  
       2016-09-25 19:31:34 +08:00 via iPhone
    @Newyorkcity 0.x 的模式叫 subnormal 模式的浮点数,你可以去查一下 IEEE754 标准的浮点数定义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   884 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.