python 中 math.pow、numpy.power、numpy.float_power、pow 和 ** 的准确性

Accuracy of math.pow, numpy.power, numpy.float_power, pow and ** in python

提问人:user3563894 提问时间:12/3/2020 最后编辑:user3563894 更新时间:12/3/2020 访问量:566

问:

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

Python 数学 浮动精度

评论


答:

1赞 dmuir 12/3/2020 #1

在所有情况下都会失去精度的一种方式是,如果您计算的是小数字(z),然后计算

p = pow( 1.0+z, y)

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

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

您可以将上面的 p 计算为

   p = exp( log1p(z)*y)

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

评论

0赞 user3563894 12/3/2020
谢谢!它比以数字为基数 2 而不是以 e 为基础更好吗?我之所以问,是因为我认为 log2 比 log1p 更准确。
0赞 dmuir 12/3/2020
我不认为有 log21p(可以计算 log2(1+p)。所以可能最好使用 log1p