python中的exp(x)溢出

时间:2017-03-09 19:07:07

标签: python-3.x numpy

我正在使用函数:numpy.log(1 + numpy.exp(z))

对于z(1-705)的小值,它给出了身份结果(1-705 {如预期的}), 但是对于从710+开始的更大的z值,它会给出无穷大,并且抛出错误"运行时警告:在exp中遇到溢出"

2 个答案:

答案 0 :(得分:3)

对于大型 z ,您可以使用

z + log(exp(-z) + 1)

在数学上但在数字上不是同一件事。

在代码中:

(z + np.log(np.exp(-z) + 1)) if z > 0 else np.log(1 + np.exp(z))

如果您需要矢量化版本:

np.maximum(z, 0) + np.log(np.exp(-np.absolute(z)) + 1)

正如@Praveen指出的那样,有一个函数np.log1p可以计算log(1 + x),但如果| x |则更准确。是小。我建议在上面使用它。

答案 1 :(得分:0)

正在发生的事情是,您正在溢出寄存器,使其覆盖自身。您已超过可以存储在寄存器中的最大值。您将需要使用很可能与exp(。)不兼容的其他数据类型。您可能需要一个适用于64位整数的自定义函数。