Python:限制float的准确性

时间:2015-08-03 16:59:03

标签: python rounding floating-point-precision

代码给出错误,因为“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))

2 个答案:

答案 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)