【问题标题】:Non-zero arithmetic check in PythonPython中的非零算术检查
【发布时间】:2013-09-18 02:19:02
【问题描述】:

这个数学方程式...

(4195835 / 3145727) * 3145727 - 4195835

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

如果您得到其他任何东西,您有一个旧的 Intel Pentium CPU,带有一个 浮点除法 buga 软件错误烧入计算机芯片 并在制造过程中反复复制。

使用 Python 2.7,我在命令行中得到 -1050108

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

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

【问题讨论】:

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

标签: python math python-2.7 command-line floating-point


【解决方案1】:

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

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

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

>>> from __future__ import division
>>> (4195835 / 3145727) * 3145727 - 4195835
0.0

【讨论】:

    【解决方案2】:

    使用整数数学(这是您正在使用的),(4195835 / 3145727) 将为您提供 1.33382... 向下舍入为整数 1

    所以你实际上最终得到:

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

    这就是你得到那个负数的原因。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 2011-01-17
      • 2023-03-22
      • 2011-12-15
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多