[英]floating point approximation in python
我是 python 的新手,我正在尝试了解浮点数近似值以及浮点数在 Python 中的表示方式。
例如:
>>> .1 + .1 + .1 == .3
False
>>> .25 + .25 + .25 == 0.75
True
我理解这两种情况,但是这些具体情况呢?
>>> .1 + .1 + .1 +.1 == .4
True
>>> .1 + .1 == .2
True
是否巧合只是因为 .1+.1+.1+.1 和 .1+.1 的值分别等于 .4 和 .2 即使这些数字在 Python 中没有正确表示? 还有其他类似的情况吗?或者有什么方法可以识别它们吗?
谢谢你!
简短回答:是的,这只是巧合。
数字在 Python 中表示为 64 位 IEEE 浮点数,也称为双精度。
https://en.wikipedia.org/wiki/IEEE_754#Basic_and_interchange_formats
当你写0.3
Python 找到最接近的 IEEE 数字代表0.3
。
将多个数字相加时,最后一位数字中的这些小错误会累积起来,您最终会得到一个不同的数字。 有时这种情况发生得更早,有时则更晚。 有时这些错误会起反作用,但通常不会。
这个答案是一个很好的阅读:
要 go 更深入地了解您的示例,您需要查看这些数字的位表示。 然而,它变得复杂,因为还需要了解舍入和加法的工作原理......
浮点数在计算机硬件中表示为基数为 2(二进制)的分数。 例如,小数 0.125 的值为 1/10 + 2/100 + 5/1000,同样,二进制小数 0.001 的值为 0/2 + 0/4 + 1/8。 这两个分数具有相同的值,唯一真正的区别是第一个分数是以 10 为底的小数表示法,第二个分数以 2 为底数。
不幸的是,大多数小数不能精确地表示为二进制小数。 一个结果是,一般来说,你输入的十进制浮点数只能近似于机器中实际存储的二进制浮点数。
一种幻觉可能会产生另一种幻觉。 例如,由于 0.1 不完全是 1/10,因此将三个 0.1 值相加可能不会恰好产生 0.3,或者:
>>>.1 + .1 + .1 == .3
False
此外,由于 0.1 无法更接近 1/10 的精确值,而 0.3 无法更接近 3/10 的精确值,因此使用 round() function 进行预舍入也无济于事:
>>>round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
False
尽管无法使数字更接近其预期的精确值,但 round() function 可用于后舍入,以便具有不精确值的结果可以相互比较:
>>>round(.1 + .1 + .1, 10) == round(.3, 10)
True
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.