首页 > 解决方案 > python中math.pow、numpy.power、numpy.float_power、pow和**的准确性

问题描述

python中的math.pow、numpy.power、numpy.float_power、pow()和**在两个浮点数x、y之间是否存在准确性差异?我假设 x 非常接近 1,并且 y 很大。

标签: pythonmathfloating-accuracy

解决方案


在所有情况下都会丢失精度的一种方法是,如果您正在计算一个小数(z 说)然后计算

p = pow( 1.0+z, y)

问题是双打有大约 16 个有效数字,所以如果 z 是 1e-8,在形成 1.0+z 时,你将失去这些数字的一半。更糟糕的是,如果 z 小于 1e-16,则 1.0+z 将恰好为 1。

您可以使用 numpy 函数 log1p 来解决这个问题。这会计算其参数的对数加一,而实际上并未将其参数加 1,因此不会丢失精度。

您可以将上面的 p 计算为

   p = exp( log1p(z)*y)

这将消除由于计算 1+z 而导致的精度损失


推荐阅读