为什么IEEE754单精度浮点数只有7位精度?
为什么单精度浮点数具有7位精度(或15-16位精度)?
任何人都可以根据为浮点数分配的32位(Sign(32)Exponent(30-23),Fraction(22-0))解释我们是如何到达的吗?
有效数的23个分数位(22-0)出现在存储器格式中,但总精度实际上是24位,因为我们假设存在前导1.这相当于log10(2^24) ≈ 7.225
十进制数字。
双精度浮点数有52位,加上前导1是53.因此双log10(2^53) ≈ 15.955
数可以保持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美元。