如何设置numpy浮点精度?

如何设置numpy浮点精度?,numpy,floating-point,Numpy,Floating Point,我只是用两种方法计算了相同的数字,但在numpy中,它会出错 [[ 0.910221324013388510820732335560023784637451171875]] [[-0.9102213240133882887761274105287156999111175537109375]] 该数字在e^(-15)之前相同,但之后不同。如何处理此错误 有没有办法限制浮点精度 由于我使用这些数字计算指数,即使是很小的差异也会导致令人沮丧的错误…您可以使用math.ceil 例如,您有: a =

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

[[ 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