Python中的非零算术检查

Python中的非零算术检查,python,math,python-2.7,command-line,floating-point,Python,Math,Python 2.7,Command Line,Floating Point,这个数学方程式 (4195835 / 3145727) * 3145727 - 4195835 应该等于0。根据《软件测试》(第二版)一书 如果你有其他的东西,你有一个旧的英特尔奔腾CPU与一个 浮点除法错误烧入计算机芯片的软件错误 并在制造过程中反复复制 使用Python2.7,我在命令行中获得-1050108 使用Node我得到0,就像在计算器中一样 对此有更深刻的解释吗?这最初是由于1994年迪斯尼的《狮子王》游戏中的一个漏洞引起的。我想我会在一些事情上测试这个方程。你做的是整数数学而不

这个数学方程式

(4195835 / 3145727) * 3145727 - 4195835
应该等于
0
。根据《软件测试》(第二版)一书

如果你有其他的东西,你有一个旧的英特尔奔腾CPU与一个 浮点除法错误烧入计算机芯片的软件错误 并在制造过程中反复复制

使用Python2.7,我在命令行中获得
-1050108

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


对此有更深刻的解释吗?这最初是由于1994年迪斯尼的《狮子王》游戏中的一个漏洞引起的。我想我会在一些事情上测试这个方程。

你做的是整数数学而不是浮点数学

>>> (4195835 / 3145727) * 3145727 - 4195835
-1050108
>>> (4195835. / 3145727.) * 3145727. - 4195835.
0.0
请注意,您可以使用py3k或除法从整数中获得所需的行为

>>> from __future__ import division
>>> (4195835 / 3145727) * 3145727 - 4195835
0.0
使用整数数学(您正在使用),
(4195835/3145727)
将为您提供
1.33382…
四舍五入到整数
1

因此,你实际上最终会:

  (4195835 / 3145727) * 3145727 - 4195835
=          1          * 3145727 - 4195835
=                       3145727 - 4195835
=                           -1050108
这就是为什么你会得到那个负数

只需将其中一个值设为浮点数,即可强制其使用浮点数:

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

请注意,仅仅因为数学表达式等于零并不意味着用浮点完成的相同计算必须等于零,这不是错误,这就是标准浮点计算的工作方式。你听起来好像你的书没有很清楚地解释这一点。@PascalCuoq我相信我的书名中有一些关于这本书的信息与这个问题有关,有人修改了这个书名。不管怎样,这本书并没有试图解释浮点或其他任何东西,只是分享了“臭名昭著的软件错误案例研究”。我只是做了计算,自己试了试,当时的结果很奇怪,直到很明显,除法是四舍五入。所以,没有,这本书没有理由解释这些细节,或者应该以本章为基础。一本非常好的书,值得一读。