2024-04-20 08:52:41 发布
网友
我试图用下面的定义来计算高斯函数的值
from math import e def function(x): return 100 / (e**((x-2000)**2))**1/16
但是我得到了一个溢出值20000,30000,1000000,等等。 你知道解决办法吗 谢谢!你知道吗
使用math.exp:
math.exp
100 / math.exp((x-2000)**2))**1/16
这比e**在性能和数值上更精确。
e**
请注意,...**1/16可能并不是您想要的。**比/具有higher operator precedence,因此上述等价于(...**1)/16。将分数用括号括起来:
...**1/16
**
/
(...**1)/16
100 / math.exp((x-2000)**2)**(1/16.0)
以浮点格式(16.0)写入16以防止整数除法。
16.0
16
使用指数规则合并1/16:
1/16
100 / math.exp((x-2000)**2/16.0)
这减少了大参数,有助于提高精度。
翻转参数的符号并将除法改为乘法:
100 * math.exp(-(x-2000)**2/16.0)
在极端情况下,这将是下溢而不是溢出。在这种情况下,下溢的表现要好得多–只会得到0而不是OverflowError。
OverflowError
我的建议是重新修改这个公式,取它的对数(也就是说,把公式和项的乘积转换成每个项的对数之和),然后取结果的指数。你知道吗
使用
math.exp
:这比
e**
在性能和数值上更精确。请注意,
...**1/16
可能并不是您想要的。**
比/
具有higher operator precedence,因此上述等价于(...**1)/16
。将分数用括号括起来:以浮点格式(
16.0
)写入16
以防止整数除法。使用指数规则合并
1/16
:这减少了大参数,有助于提高精度。
翻转参数的符号并将除法改为乘法:
在极端情况下,这将是下溢而不是溢出。在这种情况下,下溢的表现要好得多–只会得到0而不是
OverflowError
。我的建议是重新修改这个公式,取它的对数(也就是说,把公式和项的乘积转换成每个项的对数之和),然后取结果的指数。你知道吗
相关问题 更多 >
编程相关推荐