ark*_*buz 5 python numpy sympy long-double
我有一段代码,其中一部分计算是使用 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数字?21?再多一点?
我在 Linux 64 位(Sandy Bridge)上使用 Python 2.7、NumPy 1.6.2、SymPy 0.7.1.rc1。实际代码在这里(nsk第 130 行左右的类)。
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
---------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
eps是满足 的最小正数1.0 + eps != 1.0,因此如果您的答案约为 1,则有 18 位有效小数。由于浮点算术的性质,这会随着数字本身的值而变化,但您始终会得到 18 位有效数字(无论有多少位小数)。
| 归档时间: |
|
| 查看次数: |
415 次 |
| 最近记录: |