如何设置numpy浮点精度?

时间:2014-08-07 11:43:18

标签: numpy floating-point

我只是用两种方式计算了相同的数字,但是在numpy中,它会出错

[[ 0.910221324013388510820732335560023784637451171875]]
[[-0.9102213240133882887761274105287156999111175537109375]]

此数字与e ^( - 15)相同,但之后有所不同。我该如何对待这个错误?

有没有办法限制浮点精度?

由于我使用这些数字计算指数,即使很小的差异也会导致令人沮丧的错误......

3 个答案:

答案 0 :(得分:14)

您是否关心结果的实际精确度,或者从两次计算中得到完全相同的数字?

如果您只想要相同的数字,可以使用np.around()将结果四舍五入到一些适当的小数位数。但是,通过这样做,您只会降低结果的精确度。

如果您确实想要更精确地计算结果,可以尝试使用np.longdouble类型作为输入数组,depending on your architecture and compiler可能会为您提供80位或128位浮点数表示,而不是标准的64位np.double *。

您可以使用np.finfo来比较精确的小数位数:

print np.finfo(np.double).precision
# 15

print np.finfo(np.longdouble).precision
# 18

请注意,并非所有numpy函数都支持long double - 有些将向下转换为double。


*但是,某些编译器(例如Microsoft Visual C ++)会始终将long double视为double的同义词,在这种情况下,np.longdouble和{之间的精度不会有差异{1}}。

答案 1 :(得分:4)

在正常的numpy使用中,数字是双倍的。 这意味着精度将低于16位。 这是一个contains the same problematic ...

的解决主题

如果您需要提高准确度,可以使用symbolic computation ...。 图书馆mpmath ...是一个安静的好书。 优点是您可以使用无限精度。 但是,计算速度比numpy能做的慢。

以下是一个例子:

# The library mpmath is a good solution
>>> import sympy as smp
>>> import mpmath as mp

>>> mp.mp.dps = 50  # Computation precision is 50 digits
# Notice that the difference between x and y is in the digit before last (47th)
>>> x = smp.mpmath.mpf("0.910221324013388510820732335560023784637451171875")
>>> y = smp.mpmath.mpf("0.910221324013388510820732335560023784637451171865")
>>> x - y  # Must be equal to 1e-47 as the difference is on the 47th digit
mpf('1.000014916280995001003481719184726944958705912691304e-47')

你不能用numpy做得更好。 您可以更准确地计算指数。

smp.exp(x).evalf(20) = 2.4848724344693696167

答案 2 :(得分:1)

您可以使用math.ceil

例如,您有:

a = 8.869705968794857
import math
print(math.ceil(a*1e10)/1e10)

返回8.8697059688,即最多10位小数的值。相应地将1e10更改为1e15或任何其他值

在你的情况下,它将是:

a =  0.910221324013388510820732335560023784637451171875
a = math.ceil((a*1e15)/1e15)

这将为您提供a = 0.910221324013389