【问题标题】:Can anyone explain this subtraction and summation in python? [duplicate]任何人都可以用python解释这个减法和求和吗? [复制]
【发布时间】:2013-06-15 12:15:29
【问题描述】:

我对这种减法和求和的工作方式有点困惑:

A = 5
B = 0.1
C = A+B-A

我发现答案是 0.0999999999999999645。为什么答案不是 0.1?

【问题讨论】:

标签: python


【解决方案1】:

这是因为所谓的 epsilon 值。这意味着从xx+E,每个浮点数都被认为等于x。 您可以在this Q&A 中阅读有关此值的信息 在python中这个epsilon值(E)取决于数字的大小,你总是可以从numpy.spacing(x)得到它

【讨论】:

  • 错了。 epsilon 取决于数字的大小
  • @gnibbler 所以你想说 2 个不同的浮点数不一样?
  • 0.0 附近的许多浮点数都是一样的。 大多数其他浮点数不同。您需要将指数与尾数的 lsb 结合起来以找到特定数字的 epsilon。
  • @gnibbler 您能否与包含该信息的文档相关联?因为从我在一些书籍中看到的内容来看,我的回答中相关的问答是这个值在不同语言之间是恒定的。
  • 你误解了那篇文章的意思。对x 的不同值尝试np.spacing(x),您会看到它与x 成正比。如果您需要更多说明,而您已经在这里找不到答案,您应该打开一个新问题。
【解决方案2】:

计算机使用“二进制数”来存储信息。整数可以精确存储,但小数通常存储为“浮点数”。

有些数字很容易以 10 为基数写入,但无法以二进制浮点格式精确表示,0.1 就是其中之一。

可以准确地存储数字,并准确地使用数字。例如,数字 0.1 可以存储为1 / 10,即存储为分子 (1) 和分母 (10),理​​解为分子除以分母。然后一个正确编写的数学库可以处理这些分数并为你做数学。但它比仅仅使用浮点数要慢得多,所以它并不经常使用。 (而且我认为在银行业务中,他们通常只使用整数而不是浮点来存储货币;1.23 美元可以存储为数字 123,隐含两位小数。在处理货币时,浮点数不够精确! )

【讨论】:

    【解决方案3】:

    您看到了浮点运算的人工制品,它没有无限精度。请参阅this article,了解有关 FP 数学如何工作以及为什么会出现舍入错误的完整说明。

    【讨论】:

      【解决方案4】:

      这是一个浮点舍入错误。 Python 网站有一个非常好的tutorial on floating point numbers,它解释了这是什么以及为什么会发生。

      如果你想要一个准确的结果,你可以:

      • 尝试使用decimal 模块
      • 格式化您的结果以显示设定的小数位数(这不能解决舍入错误):

        print "%.2f"%C

      我还建议阅读 Brian 的回答中的“What Every Computer Scientist Should Know About Floating-Point Arithmetic”。

      【讨论】:

        【解决方案5】:

        为什么答案不是 0.1?

        浮点数不够精确,无法得到答案。但是,圣牛是它曾经接近过!

        我建议你阅读“What Every Computer Scientist Should Know About Floating-Point Arithmetic

        【讨论】:

          猜你喜欢
          • 2019-06-02
          • 1970-01-01
          • 2016-01-14
          • 2011-03-31
          • 2016-06-16
          • 2011-08-25
          • 2019-12-29
          • 2020-09-21
          • 1970-01-01
          相关资源
          最近更新 更多