浮点型的有效位数?精度丢失?
本文最后更新于:2021年10月27日 晚上
今天发现了一个奇怪的现象:当我在 Python
使用 1.0000000000000001e-16
(即 0.0000000000000001
)去加另一个数的时候,发现无论怎么加,另一个数就是不变。这个特别长的浮点数就像 0
一样,系统自动把最后面那位 1
给省略了。
其实,早在很久以前我就已经发现了这个问题:0.1 + 0.2
竟然等于 0.30000000000000004
,并且 0.1 + 0.2 != 0.3
,这很颠覆我的三观。
有这样一段代码可以很好地显示出来:
1 |
|
我在网上翻阅了一些资料,发现原来不止 Python
,还有其他任何使用二进制浮点数的编程语言都会有这个问题。
原来,现在的计算机几乎都采用了 IEEE-745 标准
。一些浮点数在转化为二进制的时候会出现无限循环:
1 |
|
所以 0.1 + 0.2
在计算并转换为二进制的时候也不可避免地出现无限循环:
1 |
|
可以看出,0.1
和 0.2
在转换为二进制时就发生了一次精度丢失,而对于计算后的二进制又有一次精度丢失,所以最终的结果也就不准确。
在 Python
中,似乎可以这样来计算:
1 |
|
先扯这么多吧!今天收获了一个硬核的芝士~
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!