如何在python中处理64float精度的指数溢出?

时间:2017-05-17 19:43:54

标签: python numpy

我是python的新手,抱歉这个简单的问题。

在下面的代码中,我想计算指数,然后记录日志。

Y=numpy.log(1+numpy.exp(1000))

问题是,当我取710或更大数字的指数时,numpy.exp()函数返回' inf'即使我用64float打印它也会打印' inf'

有关此问题的任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:3)

您可以使用函数np.logaddexp()执行此类操作。它计算logaddexp(x1, x2) == log(exp(x1) + exp(x2))而不显式计算中间exp()值。这可以避免溢出。自exp(0.0) == 1起,您可以按预期计算np.logaddexp(0.0, 1000.0)并获得1000.0的结果。

答案 1 :(得分:1)

使用小数库:

>>> import numpy as np
>>> np.exp(1000)
inf
>>> from decimal import Decimal
>>> x = Decimal(1000)
>>> np.exp(x)
Decimal('1.970071114017046993888879352E+434')

答案 2 :(得分:1)

检查出来:

>>> x = numpy.exp(100)
>>> y = x+1
>>> y==x
True

所以即使使用100(计算可以正确),添加1(甚至是非常大的数字),最低值也会被吸收,并且对添加没有任何影响。两个值都严格相等。

使用sys.float_info.epsilon我测试过:

>>> numpy.log(1e20+numpy.exp(100))==numpy.log(numpy.exp(100))
True
>>> numpy.log(1e30+numpy.exp(100))==numpy.log(numpy.exp(100))
False

所以即使像1e20这样的值被exp(100) ...

吸收

因此,即使有效,您也会得到1000.0的结果。