代码给出错误,因为“var”的值非常接近于零,小于1e-80。我尝试使用“导入小数*”修复此错误,但它确实没有用。当浮点数非常接近于零时,有没有办法告诉Python将数字四舍五入为零,即< 1E-50?或者任何其他方法来解决这个问题?
谢谢你
代码:
import math
H=6.6260755e-27
K=1.3807e-16
C=2.9979E+10
T=100.0
x=3.07175e-05
cst=2.0*H*H*(C**3.0)/(K*T*T*(x**6.0))
a=H*C/(K*T*x)
var=cst*math.exp(a)/((math.exp(a)-1.0)**2.0)
print var
输出:
Traceback (most recent call last):
File "test.py", line 11, in <module>
var=cst*math.exp(a)/((math.exp(a)-1.0)**2.0)
OverflowError: (34, 'Numerical result out of range')
凯文: 使用以下行编辑代码:
from decimal import *
getcontext().prec = 7
cst=Decimal(2.0*H*H*(C**3.0)/(K*T*T*(x**6.0)))
a=Decimal(H*C/(K*T*x))
答案 0 :(得分:1)
问题是(math.exp(a)-1.0)**2.0
太大而不能作为中间结果。
>>> (math.exp(a) - 1.0)**2.0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')
但是,对于您正在使用的a
的值,
>>> math.exp(a)/(math.exp(a)-1.0) == 1.0
True
所以你基本上可以取消那部分分数,留下
var = cst/(math.exp(a)-1.0)
很好地评估
>>> cst/(math.exp(a)-1.0)
7.932672271698049e-186
如果您不习惯将公式重写为该范围,请使用操作的关联性来避免大的中间值。得到的产品是一样的。
>>> cst/(math.exp(a)-1.0)*math.exp(a)/(math.exp(a)-1.0)
7.932672271698049e-186
答案 1 :(得分:0)
我解决了这个问题,但这只适用于这个特定的问题,而不是一般的问题。主要问题是这个功能的性质:
math.exp(a)/(math.exp(a)-1.0)**2.0
衰退很快。 可以很容易地解决问题,限制“a”的值(这不会对计算产生任何重大变化)。即。
if a>200:
var=0.0
else:
var=cst*math.exp(a)/((math.exp(a)-1.0)**2.0)