5

我有一个代码,其中一部分计算使用 NumPy 函数和 longdoubles 完成,另一部分使用 SymPy 符号微分和数值评估,然后连接在一起(到 SymPy 浮点数)。Sympy 评估可以以任意精度完成,但是什么精度才足够好,即不会“污染”longdoubles 结果?据我了解,NumPy longdouble 实际上只有 80 位长,尽管float128在我的系统上被调用。维基百科说大约 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数字。有趣的是,默认 double 的精度等于默认的 SymPy 数值评估精度(15vs. 15)。

假设我将 longdouble 结果转换为 SymPy 浮点数(然后在 SymPy 上工作),我应该设置什么 SymPy 精度?18数字?21? 再多一点?

我在 Linux 64 位(Sandy Bridge)、NumPy 1.6.2、SymPy 0.7.1.rc1 上使用 Python 2.7。实际代码在这里nsk第 130 行左右的类)。

4

1 回答 1

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 位有效数字(无论是多少小数)。

于 2014-04-27T16:29:29.250 回答