Python:OverflowError:数学范围错误

40

我在尝试这个计算时遇到了溢出错误,但我无法弄清楚原因。

1-math.exp(-4*1000000*-0.0641515994108)

2
在Linux的calc中计算您表达式的math.exp需要很长时间 - 实际上在我的电脑上大约需要3分钟。输出无法适应屏幕,但这是它的最后一部分:72601064848030549330052235283692208900018564830019400961030549300613573049038658490326003709885716700599883485335384987825755170505520081515667880006364976728119694600659746416440802282624919298297947165561974790549306225384099033699937030324423057761382164874383992786304290520859618809208146480637711575173287535774531529104427355177803053295844887694582338200906830029698966101673406039727344889895537434766431106 - kovshenin
6个回答

42

你请求math.exp计算的数字在十进制下有超过110,000位数。这略微超出double类型能表示的范围,因此导致了溢出。


29

要解决这个问题,请使用:

try:
    ans = math.exp(200000)
except OverflowError:
    ans = float('inf')

5

我认为在Python中,数值过大无法适应double的范围,这就是为什么会出现OverflowError。在我的机器上,我可以计算的最大值的exp略大于709.78271。


5

使用np.exp()替代math.exp()

Numpy的溢出处理更加优雅,np.exp(999)的结果为inf, 因此1. / (1. + np.exp(999))的结果直接为零

import math 
import numpy as np

print(1-np.exp(-4*1000000*-0.0641515994108))

4
这可能会给你一些线索,说明为什么:
http://www.wolframalpha.com/input/?i=math.exp%28-4*1000000*-0.0641515994108%29

请注意111442指数。

4

不幸的是,没有人解释真正的解决方案。我使用以下方法解决了问题:

from mpmath import *

您可以在下面找到文档:

http://mpmath.org/


在这里,您可以找到expo()方法 https://mpmath.org/doc/current/functions/powers.html#exponentiation - pyjavo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接