Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 混合NumPy-longdouble和SymPy数值计算–;精确性呢?_Python_Numpy_Sympy_Long Double - Fatal编程技术网

Python 混合NumPy-longdouble和SymPy数值计算–;精确性呢?

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

我有一个代码,其中一部分计算是使用NumPy函数和longdouples完成的,另一部分使用SymPy符号微分和数值计算,然后连接在一起(到SymPy float)。Sympy评估可以以任意精度进行,但什么精度才足够好,即不会“污染”longdoubles结果?据我所知,尽管在我的系统中被称为
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。