如何设置numpy浮点精度?
我只是用两种方法计算了相同的数字,但在numpy中,它会出错如何设置numpy浮点精度?,numpy,floating-point,Numpy,Floating Point,我只是用两种方法计算了相同的数字,但在numpy中,它会出错 [[ 0.910221324013388510820732335560023784637451171875]] [[-0.9102213240133882887761274105287156999111175537109375]] 该数字在e^(-15)之前相同,但之后不同。如何处理此错误 有没有办法限制浮点精度 由于我使用这些数字计算指数,即使是很小的差异也会导致令人沮丧的错误…您可以使用math.ceil 例如,您有: a =
[[ 0.910221324013388510820732335560023784637451171875]]
[[-0.9102213240133882887761274105287156999111175537109375]]
该数字在e^(-15)之前相同,但之后不同。如何处理此错误
有没有办法限制浮点精度
由于我使用这些数字计算指数,即使是很小的差异也会导致令人沮丧的错误…您可以使用
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.91022132401389
您关心结果的实际精度,还是关心从两次计算中获得完全相同的数字
如果只需要相同的数字,可以使用将结果四舍五入到适当的小数位数。但是,这样做只会降低结果的精度
如果您确实想更精确地计算结果,可以尝试为输入数组使用np.longdouble
类型,这可能会为您提供80位或128位浮点表示,而不是标准的64位np.double
*
您可以使用以下方法比较精度的小数位数:
请注意,并非所有numpy函数都支持长双精度-有些函数会将其向下转换为双精度
*但是,一些编译器(如Microsoft Visual C++)总是将
long double
视为double
的同义词,在这种情况下np.longduble
和np.double之间的精度没有差别。在正常的numpy使用中,数字是双精度的。
这意味着精度将小于16位。
这是一个已经解决的问题
如果需要提高精度,可以使用。
这是一个安静的好图书馆。
优点是可以使用无限精度。
然而,计算比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
请注意,对于0.7.6之后的Symphy版本,mpmath不再与Symphy打包,而是一个依赖项。这意味着在较新的Symphy版本中,symphy.mpmath
函数已移动到mpmath
可以发布代码吗?数组的数据类型是什么?输出的位数太多了。由于仅打印数字不会显示python打印函数的任何差异,因此我添加了np.set_printoptions(精度=70)OP希望计算更精确的结果,而不是隐藏不精确性。如果“numpy.longdouble
指的是C编译器调用的任何类型longdouble
”正如您的链接中所述,不幸的是,对于某些C编译器,它不会比double
(例如Visual Studio)更精确。不过,回答这个问题需要+1。我不知道有哪个主流平台会有128位浮点类型。OSX将np.longdouble
报告为numpy.float128
,但它是谎言——它是相同的旧80位x87扩展精度类型,填充了6个零字节。(类似地,32位Linux通常报告与numpy.float96
相同的类型)
>>> smp.exp(x).evalf(20)
2.4848724344693696167