我有一个代码,其中一部分计算使用 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 行左右的类)。