当从单个浮点数中减去数组时,我遇到了 python 自动舍入非常小的数字(小于 1e-8)的问题。举个例子:
import numpy as np
float(1) - np.array([1e-10, 1e-5])
关于如何强制 python 不圆的任何想法?在某些情况下,这迫使我除以零,并成为一个问题。从 numpy 数组中减去时会出现同样的问题。
当从单个浮点数中减去数组时,我遇到了 python 自动舍入非常小的数字(小于 1e-8)的问题。举个例子:
import numpy as np
float(1) - np.array([1e-10, 1e-5])
关于如何强制 python 不圆的任何想法?在某些情况下,这迫使我除以零,并成为一个问题。从 numpy 数组中减去时会出现同样的问题。
大多数情况下,只是repr
numpy 数组在愚弄你。
考虑上面的示例:
import numpy as np
x = float(1) - np.array([1e-10, 1e-5])
print x
print x[0]
print x[0] == 1.0
这产生:
[ 1. 0.99999 ]
0.99999999999
False
所以第一个元素实际上并不是零,它只是以这种方式显示它的 numpy 数组的漂亮打印。
这可以通过 来控制numpy.set_printoptions
。
当然,numpy 从根本上说是使用有限精度的浮点数。numpy 的重点是成为类似数据数组的内存高效容器,因此decimal
numpy 中没有类的等价物。
但是,64 位浮点数具有不错的精度范围。1e-10 和 1e-5 不会遇到太多问题。如果需要,还有一个numpy.float128
dtype,但操作会比使用本机浮点数慢得多。
我想这一切都取决于 Python 和底层 C 库对非常小的浮点数的处理,在某些时候往往会降低精度。
如果您需要那种级别的精度,恕我直言,您应该依靠不同的东西,例如分数等。
我不知道是否已经有一些东西可以处理,但如果你能设法以不同的方式(例如1/10000000000
and 1/100000
)表示这些数字,然后只在所有计算结束时计算浮点结果,你应该避免所有这些问题。
(当然,您需要一些自动处理分数计算的类,以避免重新实现公式等)