Python:对float精度的限制

Python:对float精度的限制,python,rounding,floating-point-precision,Python,Rounding,Floating Point Precision,代码给出了一个错误,因为“var”的值非常接近于零,小于1e-80。我尝试使用“Import decimal*”来修复此错误,但它并没有真正起作用。当浮点数非常接近零,即

代码给出了一个错误,因为“var”的值非常接近于零,小于1e-80。我尝试使用“Import decimal*”来修复此错误,但它并没有真正起作用。当浮点数非常接近零,即<1e-50时,有没有办法告诉Python将一个数舍入为零?或者以任何其他方式解决此问题?
谢谢你
代码:

输出:

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')
问题是
(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')
所以你可以基本上取消那部分分数,留下

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

我解决了这个问题,但这只适用于这个特定的问题,而不是一般的问题。主要问题是该职能的性质:

math.exp(a)/(math.exp(a)-1.0)**2.0
它腐烂得很快。 限制“a”的值(这不会对计算产生任何重大变化)很容易解决这个问题。i、 e


我试图用“导入小数*”来修复这个错误,但它并没有真正起作用?让我们看看您尝试过的代码。“当浮点数非常接近零时,有没有办法告诉Python将一个数舍入为零,即<1e-50?”-
num=0如果abs(num-0)<1e-50 else num
?@jornsharpe:程序需要首先计算“var”才能使用“if”语句。True,但是代码本身似乎使用了语法正确的
from decimal import*
import decimal*
语句,因为
decimal
模块不存在(它存在),它是一个无意义语句,因为它是一个
语法错误。如前所述,正确的语法是decimal import*
中的
>>> 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
math.exp(a)/(math.exp(a)-1.0)**2.0
if a>200:
    var=0.0
else:
    var=cst*math.exp(a)/((math.exp(a)-1.0)**2.0)