Python math is wrong
Possible Duplicate:
Python rounding error with float numbers
号
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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 |
为什么python的数学错误?
- 浮点数不能覆盖所有实数,怎么可能?在任何非平凡的范围内,实数(甚至有理数)都是无穷多的,但只有有限的位数来表示它们。所以python的数学是正确的-对于浮点运算。
- 阅读此链接的第14.1节:docs.python.org/tutorial/floatingpoint.html
- python的数学没有错。你不懂计算机上浮点数字的表示法,也不懂这些数字的算术。阅读其他评论建议的资源。
- 从数学上讲,python数学是错误的。正是因为始终正确是计算上不可行的(像EDOCX1[0]这样的数字在有限的空间中甚至无法表示,如果不直接将它们编码为像EDOCX1[0]这样的东西)。很长一段时间以来,python的浮点运算中的错误被认为是"它的工作方式",而我们必须从实用主义的角度来面对它。对于程序员来说,意识到这一点是非常重要的,但是我们都有这个困惑的时刻。
- 所有删除投票人,请不要删除一个问题,这是对遇到类似问题的用户的一个很好的标志。
- 所有其他编程语言都有相同的基本问题。我记得上世纪70年代末在CBM BASIC的一个Pet2000准将身上第一次看到这个…
- python的数学是错误的,因为他们选择使用C浮点库进行数学运算,而他们选择的库具有这种行为。错误的是,在他们可以选择映射到浮点数的所有无限个定点数中,他们选择的数字肯定不是精确算术给出的数字。我认为它是通过使用专用的数学库在python 3.x中修复的?
- @大卫这个问题是使用二元浮点表示的特有问题。简单的操作,如加/减/乘/除不使用库,它们是一个CPU指令。有一个Decimal模块可以用十进制表示法代替,但它不是默认的,因为它慢得多。同一个模块在python 2中可用。
- @马克·兰索姆:当人们使用他们不理解的浮点数学来做他们不理解的事情时,这个问题是普遍存在的。请看docs.python.org/3/tutorial/floatingpoint.html"从python 3.1开始,python(在大多数系统上)现在可以选择其中最短的,并且只显示0.1。"
- @大卫,仅仅因为python改变了他们选择取整显示数字的方式并不意味着问题就消失了,只是他们在隐藏数字方面做得更好。实际上什么都没修好。如果我不清楚,这与基于C库无关,这只是处理器的工作方式。我同意许多人不理解二元浮点的工作方式,但这不太可能改变,因为二元浮点是如此不具有逻辑性。
你在计算机科学上已经达到了一个新的水平,而且你已经长大了。
因此,您现在已经为下一步做好了准备。我本人已获英国外交部授权向您透露以下绝密文件。古人先理解它,然后把它破译出来,现在,你也一样!
浮点引导
小心对待此文档!只有和你认识的人分享这个,你才能得出同样令人困惑的结论!
Moderator's Note
This answer is not representative of the expected quality standards on Stack Overflow. However, it has unexpectedly developed a life of its own and is solely preserved for historical significance now.
号
- 什么是BDFL?!
- @sid:en.wikipedia.org/wiki/benewiolent_独裁者_for_life
- 你能概括一下你所包含的链接吗?只有链接的答案通常是不受欢迎的。
- @Tankorsmash:那样会使这里的观点完全失败。你确实看到了关于这个答案的第一条评论,对吧?
- @MartijnPieers这当然是一个广泛的话题,但它将有利于网站有一些上下文到链接。我的意思是,其他79个人可能是错的,但我支持他们说这个答案应该改进。
- @Tankorsmash:你错过了这里的全部要点。请注意,任何来到这里的匿名访问者(在Google上搜索"python math is wrong")都会被重定向到已经存在所有信息的规范文章。这篇文章从来就不是一个严肃的回答,它已经开始了自己的生活。就像用regex应答解析HTML一样,这并不是完全不同的东西。总结相关内容将在实质上改变这种性质。
- @Tankorsmash:我看到我提到的具体评论已经被删除;我不是指阿尔沙吉在这里的评论(我直接回答,但现在也没了)。那时我的新评论将取代它们。
- @马蒂·皮耶特很抱歉,那时我错了,从来没有人在这里联系过我,我只是假设这是一个常见的问题,答案是适当有用的。谢谢你解释情况。
要获得有关浮点运算如何工作的极其严格的指南,请完成有关如何计算答案中错误的大小的说明,您需要:
每一个计算机科学家都应该知道什么是浮点运算
一旦你读过这篇文章,你就应该去寻找8087的注释,因为它很难实现IEEE754,这会给你的生活带来新的令人兴奋的问题。
- IEEE754在8087年后才开始使用。批评8087未能达到发明时不存在的标准似乎很严厉!
- 8087被用作IEEE754的基础。80387及其继任者随后实施了IEEE754。