我正在尝试使用以下定义来计算高斯函数的值
from math import e
def function(x):
return 100 / (e**((x-2000)**2))**1/16
但是我得到的值为20000、30000、1000000等的溢出。 您知道解决方法 谢谢!
答案 0 :(得分:2)
使用math.exp
:
100 / math.exp((x-2000)**2))**1/16
与e**
相比,它的性能和数值精度更高。
请注意,...**1/16
可能无法满足您的要求。 **
比/
具有higher operator precedence,因此上述内容等效于(...**1)/16
。将小数部分括在括号中:
100 / math.exp((x-2000)**2)**(1/16.0)
以浮点格式(16
)编写16.0
以防止整数除法。
使用指数规则并入1/16
:
100 / math.exp((x-2000)**2/16.0)
这减少了大参数,这有助于提高精度。
翻转参数的符号并将除法更改为乘法:
100 * math.exp(-(x-2000)**2/16.0)
在极端情况下,这将下溢而不是溢出。在这种情况下,下溢的行为要好得多–您将得到零而不是OverflowError
。
答案 1 :(得分:1)
我的建议是通过取公式的对数来重新构造公式(即,将公式与项的乘积转换为每个项的对数之和),然后取结果的指数。