V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rcocco
V2EX  ›  程序员

这个浮点数加法算法究竟哪里不对?

  •  
  •   rcocco · 2020-11-24 20:28:32 +08:00 · 1408 次点击
    这是一个创建于 1458 天前的主题,其中的信息可能已经有所发展或是发生改变。

    计算1000.1+0.2,把尾数前面隐含的 1 位也写出来,也加上 Guard bit 、Round bit 和 Sticky bit

    1000.1 =
    0 10000001000 1.1111010000001100110011001100110011001100110011001101 000 
    0.2 =
    0 01111111100 1.1001100110011001100110011001100110011001100110011010 000
    
    1. 指数大的减小的得到移位量10000001000-01111111100=1100,即 12 。
    2. 把较小值的尾数右移 12 位得到
      0.0000000000011001100110011001100110011001100110011001 100
      
    3. 尾数相加
      1.1111010000001100110011001100110011001100110011001101 000 +
      0.0000000000011001100110011001100110011001100110011001 100
      ==========================================================
      1.1111010000100110011001100110011001100110011001100110 100
      
    4. 隐含位为 1,不需要再调整,得到
      0 10000001000 1.1111010000100110011001100110011001100110011001100110 100
      
    5. Guard bit 、Round bit 和 Sticky bit 是100中间值,向偶数舍入,使最低有效位为 0
      0 10000001000   1111010000100110011001100110011001100110011001100110
      

    为啥这样算出来的值和 JavaScript 中1000.1+0.2差 1 个 bit ? JS 中得到的值是下面这个

    0 10000001000 1111010000100110011001100110011001100110011001100111
    

    和之前算的就差 1 个 bit

    0 10000001000 1111010000100110011001100110011001100110011001100110
    
    let d = new DataView(new ArrayBuffer(8));
    d.setFloat64(0, 1000.1+0.2);
    console.log(d.getBigUint64(0).toString(16));
    
    2 条回复    2020-11-24 20:59:53 +08:00
    no1xsyzy
        1
    no1xsyzy  
       2020-11-24 20:44:26 +08:00
    猜想是右移 12 位后最后 1001 101 吧?
    那样就进了 1
    rcocco
        2
    rcocco  
    OP
       2020-11-24 20:59:53 +08:00
    @no1xsyzy 对,我忘了 sticky bit 置 1 后哪怕再移位也是不变的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:13 · PVG 22:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.