为什么单精度浮点数具有 7 位精度(或双倍 15-16 位精度)?
谁能解释一下我们如何根据分配给 float(Sign(32) Exponent(30-23), Fraction (22-0)) 的 32 位得出这一点?
尾数的 23 个小数位 (22-0) 出现在内存格式中,但总精度实际上是 24 位,因为我们假设有一个前导 1。这相当于log10(2^24) ≈ 7.225
小数位。
双精度浮点型的小数部分有 52 位,加上前导 1 就是 53 位。因此 double 可以容纳log10(2^53) ≈ 15.955
十进制数字,不完全是 16。
注意:前导 1 不是符号位。它实际上是(-1)^sign * 1.ffffffff * 2^(eeee-constant)
但我们不需要存储分数中的前导 1。符号位仍必须被存储
有一些数字不能表示为 2 的幂和,例如 1/9:
>>>> double d = 0.111111111111111;
>>>> System.out.println(d + "\n" + d*10);
0.111111111111111
1.1111111111111098
如果一个金融程序一遍又一遍地进行这种计算而不进行自我修正,最终就会出现差异。
>>>> double d = 0.111111111111111;
>>>> double sum = 0;
>>>> for(int i=0; i<1000000000; i++) {sum+=d;}
>>>> System.out.println(sum);
111111108.91914201
经过 10 亿次求和后,我们损失了超过 2 美元。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)