为什么IEEE754单精度浮点数只有7位精度?

avu*_*nda 3 .net c# java variables types

为什么单精度浮点数具有7位精度(或15-16位精度)?

任何人都可以根据为浮点数分配的32位(Sign(32)Exponent(30-23),Fraction(22-0))解释我们如何到达

Ron*_*Ron 9

有效数的23个小数位(22-0)出现在存储器格式中,但总精度实际上是24位,因为我们假设有一个前导1.这相当于log10(2^24) ? 7.225十进制数字.

双精度浮点数的分数为52位,加上前导1为53.因此,双精度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
Run Code Online (Sandbox Code Playgroud)

如果财务计划要反复进行这种计算而不进行自我纠正,最终会出现差异.

>>>> double d = 0.111111111111111;
>>>> double sum = 0;
>>>> for(int i=0; i<1000000000; i++) {sum+=d;}
>>>> System.out.println(sum);
111111108.91914201
Run Code Online (Sandbox Code Playgroud)

经过10亿次总结,我们失去了超过2美元.

  • @ jb_2519正如Ron所示,双精度浮点数的精度为15.955*十进制*.这意味着您可以很好地依赖前15*十进制*数字是准确的,任何后续数字最多只能部分表示.就个人而言,我不会依赖于超过第14位(或单精度第6位)十进制数字的任何内容. (3认同)
  • @PankajMahato这就是您的计算方式。例如,如果我们要表示以10为底的数字2 ^ 24,则它是16777216。由于log10(2 ^ 24)= 7.225,我们可以看到这应该是前导数字,再加上7。相反,如果要查看最小的二进制数字是十进制的8位以下数字,我们将计算以下内容:log2(10 ^ 8)= 26.58。因此,我们需要一个27位的二进制数来获取十进制数,该十进制数具有一个前导数字,后跟8个(总共9个数字)。请记住,10 ^ 8是一个1,后跟8个零,总共9个数字。 (2认同)