【问题标题】:Handling floating-point numbers in Python3在 Python3 中处理浮点数
【发布时间】:2021-07-01 18:49:49
【问题描述】:

我是一位经验丰富的 R 用户,几天以来我一直在尝试自学 Python3。 Python 处理浮点数的方式一开始让我很困惑。例如,

print(1.1+2.2==3.3)

将返回False。我知道我可以通过使用 decimal 模块来解决 Python 如何解释浮点数的这个“问题”。

import decimal as d
print(d.Decimal("1.1")+d.Decimal("2.2")==d.Decimal("3.3"))

将返回True,这正是我想要的。

但这如何与变量或其他函数一起工作?例如,我想计算以下矩阵的行列式:

import numpy as np
from numpy import linalg

A = np.array([[1,2],[3,4]])
Det_A = np.linalg.det(A)
print(Det_A)

结果是-2.0000000000000004,但我希望结果正好是-2。我该怎么做?

请原谅我的语言不精确,我不是计算机科学家。欢迎任何建议。

【问题讨论】:

  • 你可以在这里使用round()
  • Is floating point math broken? 简短的回答是,你不能。
  • 1.1+2.2 == 3.3False 是标准浮点问题。它根本不是特定于 Python 的。如果您在 C 或任何其他使用 IEEE 浮点的语言中尝试过它,您可能会看到同样的结果。通常,比较浮点数是否相等是没有意义的。
  • 我不认为浮点是问题,我也不认为使用十进制包是你想要的。问题是您没有正确使用浮点数。在浮点数中,您想要的不是比较a + b == c,而是abs(a + b - c) <= epsilon 用于一些小的epsilon。相等比较通常不会经常出现,但当它们出现时,您需要考虑误差范围。

标签: python floating-point determinants


【解决方案1】:

SciPy 似乎能够比 NumPy 更准确地计算行列式。例如:

import numpy as np
from scipy import linalg

A = np.array([[1,2],[3,4]], dtype=float)

print(np.linalg.det(A))  # => -2.0000000000000004
print(linalg.det(A))     # => -2.0

我不确定这是否普遍,但使用 SciPy 版本seems to be preferred,因此在可能的情况下似乎是合理的。例如。如果你正在制作一个 Docker 容器,并且引入 SciPy 的唯一原因是为了获得更准确的行列式,那么我不会这样做,但在本地工作或使用更多功能时,可能值得使用 SciPy。

另请注意,R 在使用浮点数学时也会遇到同样的问题,例如,在 R 中输入 1.1 + 2.2 == 3.3 时,我得到了 FALSE。这可以通过计算 (1.1 + 2.2) - 3.3 来确认,在 R 中输出:

4.440892e-16

而 Python 提供:

4.440892098500626e-16

这些是相同的值,只是 Python 在显示结果时更精确。

【讨论】:

    【解决方案2】:

    您的应用程序可以转换为整数吗? print(int(Det_A)) 或者只打印小数点后两位print({:.2f}".format(Det_A))

    【讨论】:

    • 是的,这样就可以了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2014-04-10
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多