有效数的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美元.
归档时间: |
|
查看次数: |
2825 次 |
最近记录: |