【发布时间】:2014-06-12 03:34:57
【问题描述】:
我有一个代码,其中一部分计算使用 NumPy 函数和 longdoubles 完成,另一部分使用 SymPy 符号微分和数值评估,然后连接在一起(到 SymPy 浮点数)。 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 数字。有趣的是,默认 double 的精度等于默认 SymPy 数值计算精度(15 与 15)。
假设我将 longdouble 结果转换为 SymPy 浮点数(然后在 SymPy 上工作),我应该设置什么 SymPy 精度? 18 数字? 21?还有一点?
我在 Linux 64 位(Sandy Bridge)、NumPy 1.6.2、SymPy 0.7.1.rc1 上使用 Python 2.7。实际代码is here(nsk 130 行左右的类)。
【问题讨论】:
标签: python numpy sympy long-double