【问题标题】:Mixing NumPy longdouble and SymPy numerical evaluation – what about precision?混合 NumPy longdouble 和 SymPy 数值计算——那么精度呢?
【发布时间】:2014-06-12 03:34:57
【问题描述】:

我有一个代码,其中一部分计算使用 NumPy 函数和 longdoubles 完成,另一部分使用 SymPy 符号微分和数值评估,然后连接在一起(到 SymPy 浮点数)。 Sympy 评估可以以任意精度完成,但什么精度才足够好,即不会“污染”longdoubles 结果?据我了解,NumPy longdouble 实际上只有 80 位长,尽管在我的系统上被称为 float128Wikipedia 表示大约 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 说精度取决于数字的转换方式(1821 数字),而 Numpy 只是说它是 18 数字。有趣的是,默认 double 的精度等于默认 SymPy 数值计算精度(1515)。

假设我将 longdouble 结果转换为 SymPy 浮点数(然后在 SymPy 上工作),我应该设置什么 SymPy 精度? 18 数字? 21?还有一点?

我在 Linux 64 位(Sandy Bridge)、NumPy 1.6.2、SymPy 0.7.1.rc1 上使用 Python 2.7。实际代码is herensk 130 行左右的类)。

【问题讨论】:

    标签: python numpy sympy long-double


    【解决方案1】:

    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(在我的机器上)以尽量减少转换错误吗?通常中间值不应在计算期间四舍五入到有效数字。 (ps 我知道我最终不会得到比我最初得到的更重要的数字。)
    • 这取决于中间步骤的数量。只需计算它们,假设最坏的情况,然后传播错误。
    • 所以我看到事实上这两个数量都是可变的。 Longdouble 自身的精度取决于平台,而最佳 SymPy 精度取决于进行的实际计算。
    • 只是为了确保我们没有追逐野鹅:您是否测量了 Sympy 计算所需的时间作为精度的函数?仅在差异显着时才担心。
    • 嘿,我只是好奇问这个问题。实际上,该脚本是作为非常基本的物理实验的“副产品”而出现的(正如它在自述文件中所代表的那样),所以我拥有的每个数据点本身都有 0.X% - X.X% 的错误。 ;-) cw***.py 文件(导入 ncorr_stdev 模块)的执行时间对我来说通常可以忽略不计,无论精度如何。唯一的缺点是在一些 NumPy 的功能中对 NumPy 的 longduoble 的支持被破坏了。如果我再次触摸这段代码,为了简单起见,我将恢复为 Python float。
    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    • 2012-04-25
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多