【问题标题】:Rounding errors with floats in Python using Numpy使用 Numpy 在 Python 中使用浮点数舍入错误
【发布时间】:2014-08-26 04:09:00
【问题描述】:

我遇到了一个我认为与使用浮点数和精度有关的问题,但我对所涉及的各种复杂问题并不十分精通。我是一个数学家,在我看来,我还不如只是在黑板上处理小数。我将开始对此进行研究,但与此同时,我想知道是否有任何通用技术可以使用浮点数来解决我将在下面概述的问题。

我有一个小数数组,我想四舍五入到最接近的 0.02。我最初通过将数组的每个元素除以 0.02,将结果四舍五入,然后再次乘以 0.02 来实现这一点。实际数据是由一些处理输入的代码生成的,但这说明了问题:

x = np.array([.45632, .69722, .40692])
xx = np.round(x/.02)*.02

我可以检查一下,似乎所有内容都正确四舍五入:

xx
array([0.46, 0.7, 0.4])

但是,如果我检查第一个和第二个元素,我会得到:

xx[0]
0.46000000000000002
xx[1]
0.70000000000000007

数组中的每个元素都是 numpy.float64 类型。稍后会出现问题,因为我将这些数字与比较运算符一起用于选择数据子集,然后发生的事情有点不可预测:

xx[0] == .46
True

但是,

xx[1] == .70
False

正如我所说,我有一个解决这个特定应用程序的方法,但我想知道是否有人有办法让我的第一种方法工作,或者是否有处理这些类型的数字的技术更通用我应该知道的。

【问题讨论】:

  • 您可能应该比较没有 == 运算符的浮点数。相反,将该数字与一系列值进行比较,例如“xx[0] 在 0.46 的 1e-10 范围内?”。或者,不要使用浮点数(将每个数字保存为实际值的 100 倍)。
  • 看看 isclose 或 allclose in (numpy)[docs.scipy.org/doc/numpy-dev/reference/generated/….
  • 必填链接:floating-point-gui.de

标签: python numpy rounding-error


【解决方案1】:

与其使用== 来选择数据子集,不如尝试使用numpy.isclose()。这允许您为比较指定相对/绝对容差(absolute(a - b) <= (atol + rtol * absolute(b)))

【讨论】:

【解决方案2】:

Python 的format也可以用于此目的。

print format(xx[1], '.100f')

这段代码返回xx[1]的实际值

即。 xx[1] = 0.70000000000000006661338147750939242541790008544921875

您可以通过下面显示的代码检查这些

if xx[1] == 0.70000000000000006661338147750939242541790008544921875:
    print 'true'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多