Python:对float精度的限制
代码给出了一个错误,因为“var”的值非常接近于零,小于1e-80。我尝试使用“Import decimal*”来修复此错误,但它并没有真正起作用。当浮点数非常接近零,即<1e-50时,有没有办法告诉Python将一个数舍入为零?或者以任何其他方式解决此问题?Python:对float精度的限制,python,rounding,floating-point-precision,Python,Rounding,Floating Point Precision,代码给出了一个错误,因为“var”的值非常接近于零,小于1e-80。我尝试使用“Import decimal*”来修复此错误,但它并没有真正起作用。当浮点数非常接近零,即
谢谢你
代码: 输出:
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)