为什么单精度 float 具有 7 位精度(或 double 15-16 位精度)?
谁能解释一下我们是如何根据分配给 float(Sign(32) Exponent(30-23), Fraction (22-0)) 的 32 位得出的结果?
最佳答案
有效数的 23 个小数位 (22-0) 出现在内存格式中,但总精度实际上是 24 位,因为我们假设有一个前导 1。这相当于 log10(2^24) ≈ 7.225
十进制数。
double float 有 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
如果财务程序在没有 self 纠正的情况下一遍又一遍地进行此计算,最终会出现差异。
>>>> double d = 0.111111111111111;
>>>> double sum = 0;
>>>> for(int i=0; i<1000000000; i++) {sum+=d;}
>>>> System.out.println(sum);
111111108.91914201
经过 10 亿次求和后,我们丢失了超过 2 美元。
关于types - 为什么 IEEE754 单精度 float 只有 7 位精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19130396/