混合NumPy longdouble和SymPy数值评估 - 精度如何?

时间:2014-04-26 10:44:55

标签: python numpy sympy long-double

我有一个代码,其中一部分计算使用NumPy函数和longdoubles完成,另一部分使用SymPy符号区分和数值计算,然后连接在一起(到SymPy float)。 Sympy评估可以以任意精度进行,但是精度足够好,即不会污染" longdoubles结果?据我所知,NumPy longdouble实际上只有80位长,尽管在我的系统上被称为float128Wikipedia表示大约80位精度:

  

80位格式的十进制和二进制之间的转换的界限可以如下给出:如果具有最多18位有效数字的十进制字符串被正确舍入为80位IEEE 754二进制浮点值(如输入时) )然后转换回相同数量的有效十进制数字(如输出),然后最终字符串将与原始字符串完全匹配;而相反,如果80位IEEE 754二进制浮点值被正确转换并且(最接近)舍入为具有至少21个有效十进制数字的十进制字符串,则转换回二进制格式,它将与原始数据完全匹配。

另外,我在交互式提示中挖掘出来:

>>> numpy.finfo(numpy.double).precision
15
>>> numpy.dtype(numpy.double).itemsize
8
>>> numpy.finfo(numpy.longdouble).precision
18
>>> numpy.dtype(numpy.longdouble).itemsize
16
>>> 

所以,wiki说精确度取决于数字转换的方式(1821数字),而Numpy只是说它的18数字。有趣的是,默认双精度等于默认的SymPy数值评估精度(1515)。

假设我在一个点上将longdouble转换为SymPy float(然后在SymPy上工作),我应该设置什么SymPy精度? 18个数字? 21?还有什么?

我在Linux 64bit(Sandy Bridge),NumPy 1.6.2,SymPy 0.7.1.rc1上使用Python 2.7。第130行的实际代码is herensk类)。

1 个答案:

答案 0 :(得分:1)

IIRC,精确度实际上取决于平台。无论如何,问题是:我认为你正在查看错误的细节。

>>> print numpy.finfo(numpy.longdouble)
Machine parameters for float128
---------------------------------------------------------------------
precision= 18   resolution= 1e-18
machep=   -63   eps=        1.08420217249e-19
negep =   -64   epsneg=     5.42101086243e-20
minexp=-16382   tiny=       3.36210314311e-4932
maxexp= 16384   max=        1.18973149536e+4932
nexp  =    15   min=        -max
---------------------------------------------------------------------

eps是满足1.0 + eps != 1.0的最小正数,因此,如果您的答案大约为1,则您有18位有效小数。由于浮点运算的性质,这会随着数字本身的值而变化,但是你总是得到18个有效数字(无论多少小数)。