我只是用两种方式计算了相同的数字,但是在numpy中,它会出错
[[ 0.910221324013388510820732335560023784637451171875]]
[[-0.9102213240133882887761274105287156999111175537109375]]
此数字与e ^( - 15)相同,但之后有所不同。我该如何对待这个错误?
有没有办法限制浮点精度?
由于我使用这些数字计算指数,即使很小的差异也会导致令人沮丧的错误......
答案 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