Python数学是错误的

Python数学是错误的,python,math,numbers,Python,Math,Numbers,可能重复: 为什么Python的数学错误了?您在计算机科学方面已经达到了一个新的水平,您正在步入成年 因此,您现在已经为下一步做好了准备。我已被BDFL授权向您披露以下超级机密文件。古人首先理解并破译了它,而现在,你也将如此 小心对待这份文件!只与你认识的人分享这一点,他们得出了同样令人困惑的结论 主持人备注 这个答案不能代表烟囱溢流的预期质量标准。然而,它出人意料地发展出了自己的生命,现在被完全保留下来作为历史意义 要获得关于浮点运算如何工作的痛苦而严格的指南,以及关于如何计算答案中错误大

可能重复:


为什么Python的数学错误了?

您在计算机科学方面已经达到了一个新的水平,您正在步入成年

因此,您现在已经为下一步做好了准备。我已被BDFL授权向您披露以下超级机密文件。古人首先理解并破译了它,而现在,你也将如此

小心对待这份文件!只与你认识的人分享这一点,他们得出了同样令人困惑的结论


主持人备注

这个答案不能代表烟囱溢流的预期质量标准。然而,它出人意料地发展出了自己的生命,现在被完全保留下来作为历史意义


要获得关于浮点运算如何工作的痛苦而严格的指南,以及关于如何计算答案中错误大小的完整说明,您需要:


一旦你读到了,你应该去寻找8087上的注释,因为它执行IEEE 754很差,这可能会在你的生活中引起新的令人兴奋的问题。

没有涵盖所有的实数,它们怎么可能?在任何非平凡范围内,实数(甚至有理数)的数量都是无限的,但表示它们的位数却是有限的。因此python的数学是正确的——对于浮点算术来说。请阅读本链接的第14.1节:python数学没有错。你不懂计算机上浮点数的表示法,也不懂这些数字的算术。阅读其他评论者建议的参考资料。从数学角度来说,Python数学是错误的。只是一直保持完全正确在计算上是不可行的(像
sqrt(2)
这样的数字如果不直接将它们编码为
sqrt(2)
,它们甚至不能在有限的空间中表示)。很长一段时间以来,Python浮点运算中的错误一直被认为是“它的工作方式”,我们不得不接受这一点作为一种实用主义。程序员意识到这一点非常重要,但我们都有这个困惑的时刻。所有的删除投票者,请不要删除一个问题,这个问题对于遇到类似问题的用户来说是一个很好的路标。参见8087之后的754。批评8087没有达到发明时不存在的标准,这似乎很严厉!8087被用作IEEE754的基础。80387及其后继者随后实现了IEEE 754。什么是BDFL@希德:你能总结一下你包含的链接吗?只有链接的答案通常是不受欢迎的。@MartijnPieters这是一个广泛的主题,当然,但如果网站有一些链接的上下文,这将对网站有益。我的意思是,其他79个人可能是错的,但我和他们一样认为这个答案应该改进。@TankorSmash:你没有抓住重点。请注意,任何匿名访客(在谷歌上搜索“PythonMath是错误的”)都会被重定向到canonical post,所有这些信息都已经存在。这篇文章从来就不是一个严肃的回答,它已经开始了自己的生活。就像这个,这并不是完全不同的事情。总结链接内容将实质性地改变这种性质。
Python 2.7.3 (v2.7.3:70274d53c1dd, Apr  9 2012, 20:52:43) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 4.2 - 1.8
2.4000000000000004
>>> 1.20 - 1.18
0.020000000000000018
>>> 5.1 - 4
1.0999999999999996
>>> 5 - 4
1
>>> 5.0 - 4.0
1.0