我有一段代码,其中一部分计算是使用 NumPy 函数和 longdouble 完成的,另一部分使用 SymPy 符号微分和数值求值完成,然后连接在一起(到 SymPy float)。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
>>>
Run Code Online (Sandbox Code Playgroud)
因此,wiki 说精度取决于数字转换的方式(或者18数字21),而 Numpy 只是说它是18数字。有趣的是,默认 double 的精度等于默认 SymPy 数值计算精度(15vs. 15)。
假设我在某一点将 longdouble 结果转换为 SymPy float(然后在 SymPy 上工作),我应该设置什么 SymPy 精度?18数字? …