2

这个数学方程...

(4195835 / 3145727) * 3145727 - 4195835

应该等于0。根据软件测试(第二版)一书,

如果你得到别的东西,你有一个旧的 Intel Pentium CPU,它带有一个浮点除法 buga 软件错误,它被刻录到计算机芯片中,并在制造过程中一遍又一遍地复制。

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

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

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

4

2 回答 2

12

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

>>> (4195835 / 3145727) * 3145727 - 4195835
-1050108
>>> (4195835. / 3145727.) * 3145727. - 4195835.
0.0

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

>>> from __future__ import division
>>> (4195835 / 3145727) * 3145727 - 4195835
0.0
于 2013-09-18T02:20:45.620 回答
9

使用整数数学(这是你正在使用的),(4195835 / 3145727)会让你1.33382...四舍五入到 integer 1

所以你实际上最终得到:

  (4195835 / 3145727) * 3145727 - 4195835
=          1          * 3145727 - 4195835
=                       3145727 - 4195835
=                           -1050108

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

您可以通过将值之一设为浮点来强制它使用浮点:

>>> (4195835. / 3145727) * 3145727 - 4195835
0.0
于 2013-09-18T02:22:44.000 回答