我有一个代码,其中一部分计算使用NumPy函数和longdoubles完成,另一部分使用SymPy符号区分和数值计算,然后连接在一起(到SymPy float)。 Sympy评估可以以任意精度进行,但是精度足够好,即不会污染" longdoubles结果?据我所知,NumPy longdouble实际上只有80位长,尽管在我的系统上被称为float128
。 Wikipedia表示大约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说精确度取决于数字转换的方式(18
或21
数字),而Numpy只是说它的18
数字。有趣的是,默认双精度等于默认的SymPy数值评估精度(15
与15
)。
假设我在一个点上将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 here(nsk
类)。
答案 0 :(得分:1)
>>> 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个有效数字(无论多少小数)。