• 有米
    2019-05-31
    decimal是如何实现保证不丢精度呢?
     3
     16
  • 一步
    2019-06-06
    老师 ,这里我用 JS 代码实验了一下,JS 中的数值类型都是 IEEE754实现的浮点数类型:
        let a = 20000000;
        let b = 1;
        let c = a + b;
        console.log("c is " + c);
        let d = c - a;
        console.log("d is " + d);
    输出是:
    // "c is 20000001"
    // "d is 1"

    然后2千万个数相加:
    let result = 0;
    for (let j = 0; j < 20000000; j++) {
      result ++;
    };
    console.log('result', result)
    // result 20000000

    这里都是正确的,是 自己实现了 Kahan Summation 算法吗 ? 还是其他的原因?
    展开

    作者回复: 因为js里面你用的是64位的float啦,所以精度不再是1600万分之1了,你可以自己看看64位的精度应该是多少,试试看是不是有一样的问题。

    
     5
  • Junho
    2019-06-20
    老师好。平时会听说一种说法:在现代CPU下,定点数的执行效率比浮点数慢一到两个数量级。不知这个说法是否合理?如果合理的话,原理是什么呢?
    对于这两种表示法,在工作中的应用:游戏中涉及要求计算一致性的场合,如王者荣耀的网络同步方案。
    王者的同步方案是帧同步,在这个方案下,需要确保逻辑层的所有计算,在所有硬件下都是完全一致的,否则同步就会出现灾难性的后果。
    据找得到的资料,王者官方的分享是说,他们是用分数来代替浮点数的(分子和分母分别用整数表示),但没提及不用定点数的缘由。
    倒是腾讯另外某位技术专家,就提及了浮点数与定点数在执行效率上的差异,但没涉及原理说明,所以想请教一下老师这个问题。谢谢!
     3
     4
  • 小木匠
    2019-06-14
    老师,在Kahan 算法里,如果累积的损失精度c也不能达到1600万的条件,是不是也就不能被累加呢?比如做1亿6千万零9次加1计算,这9次是不是也就加不上了呢
    
     3
  • 有铭
    2019-05-31
    decimal难道就是所谓定点数?Java里的BigDecimal的原理是什么?
    
     3
  • Deecyn
    2019-10-11
    老师你好,

    对于 Kahan Summation 算法的这段 Java 代码:

    public class KahanSummation {
      public static void main(String[] args) {
        float sum = 0.0f;
        float c = 0.0f;
        for (int i = 0; i < 20000000; i++) {
            float x = 1.0f;
            float y = x - c;
            float t = sum + y;
            c = (t-sum)-y;
            sum = t;     
        }
        System.out.println("sum is " + sum);
      }    
    }

    当我把 i 改成循环到 2 亿左右的数,如 199999998、200000004,结果就会丢失精度,累加和总会是 2 亿,请问这是什么问题呢?
    展开
     1
     2
  • DreamItPossible
    2019-08-15
    课后思考题解答:
    首先,64位浮点数的表示方法如下:符号位是1位,指数部分为11位,尾数部分为52位;
    其次,应用本节的可知,当做加法的两个64位的浮点数的指数位相差52位后,较小的那个数就会因为要右移53位导致有效位数完全丢失;
    最后,精度缺失问题同样可以使用`Kahan Summation`算法来补偿;
    
     2
  • humor
    2019-05-31
    对于64位的符点数,符号位是52位,所以应该是如果两个相差2^53倍及以上的数相加,较小的数会完全丢失吧。
    
     2
  • 初心丶可曾記
    2019-05-31
    64位浮点数,有效位是52位,所以相差2^53会丢失较小的数
    
     2
  • supermouse
    2019-11-05
    老师,我想问一个问题,为什么19000000.0f+1.0f=19000000.0f,而19000002.0f+1.0f=19000004.0f?(数字后面跟个f代表这个数是float类型)
    19000000.0f+1.0f=19000000.0f 我能理解,因为大数吃小数,在对阶的时候 1.0f 的有效数位右移了 24 位导致精度损失,但是 19000002.0f+1.0f=19000004.0f 的结果为什么不是 19000002.0f 而是 19000004.0f呢?
    
     1
  • 活的潇洒
    2019-08-21
    过去的两个月工作有点忙,现在有时间回来开始补笔记啦:
    day16 笔记:https://www.cnblogs.com/luoahong/p/11321590.html
    
     1
  • Knight²º¹⁸
    2019-06-17
    国内Wikipedia访问不了啊,不是每个人都有vpn吧
    
     1
  • -W.LI-
    2019-06-16
    老师好!我能说我没看懂么。。。f怎么算知道了e那个3怎么来的。9.1那个。。
     1
     1
  • 逍遥思
    2019-06-16
    对Kahan Summation算法的理解:

    x,本轮要加的数
    第一个c,截止上一轮损失的精度
    第二个c,截止本轮损失的精度
    y,本轮要加的数与之前累计损失的精度之和
    前两个sum,上一轮的求和结果
    t和第三个sum,本轮的求和结果
    展开
    
     1
  • senekis
    2019-06-01
    老师,我使用了IEEE754的网站,输入浮点数9.1,得到结果:
    010000010 0010 0011001100110011 010
    而按照老师的算法, 得到的结果是:
    010000010 0010 0011001100110011 001
    差了一位,这是为什么呢?是使用方法不正确吗?
    推算了N次也没有对上,求老师给答个疑~!谢谢老师!
    展开
     3
     1
  • 小广
    2019-10-31
    吴老师好,既然9.1按浮点数合适存储起来的时候,精度已经损失了,那为什么在程序里面定义了一个变量的值为9.1后再打印结果,它还是显示9.1,而不是那个在浮点数格式中存储的不精确的的小数位很长的数呢?
    
    
  • 布丁国王
    2019-10-23
    010000010 0010 0011001100110011 001 这个二进制转十进制难道不是1091672473吗???请问9.09999942779541015625这个数是怎么来的啊???
    
    
  • prader
    2019-09-16
    1 因为浮点书在计算集中的二进制表示形式,所以在进行浮点数运算的时候,存在精度丢失的问题,为解决这个问题,可以使用软件层面的 kahan summation 算法。就是每次运算的时候,用先取到丢失的精度(通过减法),然把丢失的精度加到总和上去。
    
    
  • 小先生
    2019-08-06
    请教,为什么 1.3 + 1.6 就不会是近似数?
    
    
  • 蒋旺Foo
    2019-08-03
    Kahan summation 最后一次相加的精度一定会有损失。
    
    
我们在线,来聊聊吧