我有一个代码,其中一部分计算使用 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 数值评估精度(15
vs. 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 行左右的类)。