Python 混合NumPy-longdouble和SymPy数值计算–;精确性呢?
我有一个代码,其中一部分计算是使用NumPy函数和longdouples完成的,另一部分使用SymPy符号微分和数值计算,然后连接在一起(到SymPy float)。Sympy评估可以以任意精度进行,但什么精度才足够好,即不会“污染”longdoubles结果?据我所知,尽管在我的系统中被称为Python 混合NumPy-longdouble和SymPy数值计算–;精确性呢?,python,numpy,sympy,long-double,Python,Numpy,Sympy,Long Double,我有一个代码,其中一部分计算是使用NumPy函数和longdouples完成的,另一部分使用SymPy符号微分和数值计算,然后连接在一起(到SymPy float)。Sympy评估可以以任意精度进行,但什么精度才足够好,即不会“污染”longdoubles结果?据我所知,尽管在我的系统中被称为float128,但NumPy longdoull实际上只有80位长。表示大约80位精度: 对于80位格式,十进制和二进制之间的转换界限如下所示:如果最多有18个有效数字的十进制字符串正确舍入为80位IEE
float128
,但NumPy longdoull实际上只有80位长。表示大约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
数字。有趣的是,默认双精度等于默认的SymPy数值计算精度(15
vs.15
)
假设我在某一点将longdouble结果转换为Symphy浮点(然后处理Symphy),我应该设置什么样的Symphy精度<代码>18位数字<代码>21?再多一点
我正在Linux 64位(Sandy Bridge)、NumPy 1.6.2、SymPy 0.7.1.rc1上使用Python 2.7。实际代码(
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
---------------------------------------------------------------------
eps
是满足1.0+eps!=1.0
,因此,如果您的答案顺序为1,则您有18个有效小数。由于浮点运算的性质,它会随着数字本身的值而变化,但您总是会得到18位有效数字(不管是多少位小数)。好的,我明白,但是SymPy精度呢?我不应该把它设置得更高一点,在那些21
(在我的机器上)以最小化转换错误吗?通常,在计算过程中,中间值不应向上舍入到有效数字。(顺便说一句,我知道最后我不会得到比最初更重要的数字。)这取决于中间步骤的数量。只需计算它们,假设最坏的情况,然后传播错误。所以我发现实际上这两个量都是可变的。Longdoul自身的精度取决于平台,最佳SymPy精度取决于实际计算。为了确保我们没有追逐野鹅:您是否测量了SymPy计算所需的时间作为精度的函数?只有在差异显著时才担心。嘿,我问这个问题的时候很好奇。事实上,这个脚本作为相当基础的物理实验的“副产品”(如自述文件中所示)出现了,所以我的每个数据点本身都有0.X%-X.X%的误差;-)cw***.py文件(其中导入了ncorr_stdev模块)的执行时间对我来说通常可以忽略不计,无论精度如何。唯一的缺点是NumPy的Longdouoble在某些NumPy功能中的支持中断。如果我再次接触这段代码,为了简单起见,我将返回Python float。