【发布时间】: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/….
标签: python numpy rounding-error