Python中的非零算术检查

Sha*_*ane 2 python math floating-point command-line python-2.7

这个数学方程......

(4195835 / 3145727) * 3145727 - 4195835
Run Code Online (Sandbox Code Playgroud)

应该等同于0.根据软件测试(第2版)一书,

如果你还有其他任何东西,你就会有一个旧的英特尔奔腾CPU,它带有一个浮点分区buga软件漏洞,它被烧成一个计算机芯片并在制造过程中一遍又一遍地重现.

使用Python 2.7,我进入-1050108命令行.

使用Node我0就像在计算器中一样

对此更深入的解释?这最初是由于1994年迪士尼狮子王的视频游戏中的一个错误而提出来的.我想我会在一些事情上测试这个等式.

Bri*_*ain 12

你做了整数数学而不是浮点数学.

>>> (4195835 / 3145727) * 3145727 - 4195835
-1050108
>>> (4195835. / 3145727.) * 3145727. - 4195835.
0.0
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用py3k或PEP238除法从整数中获得所需的行为.

>>> from __future__ import division
>>> (4195835 / 3145727) * 3145727 - 4195835
0.0
Run Code Online (Sandbox Code Playgroud)


pax*_*blo 9

随着整数运算(这是你所使用的),(4195835 / 3145727)给你1.33382...四舍五入到整数1.

所以你有效地结束了:

  (4195835 / 3145727) * 3145727 - 4195835
=          1          * 3145727 - 4195835
=                       3145727 - 4195835
=                           -1050108
Run Code Online (Sandbox Code Playgroud)

这就是为什么你得到那个负数.

您可以通过使其中一个值浮点来强制它使用浮点:

>>> (4195835. / 3145727) * 3145727 - 4195835
0.0
Run Code Online (Sandbox Code Playgroud)