【问题标题】:Python overflow when calculating Gaussian function计算高斯函数时Python溢出
【发布时间】:2019-06-15 22:50:28
【问题描述】:

我正在尝试使用以下定义计算高斯函数的值

from math import e

def function(x):
    return 100 / (e**((x-2000)**2))**1/16

但是我得到了 20000、30000、1000000 等值的溢出。 你知道解决方法吗 谢谢!

【问题讨论】:

标签: python math gaussian


【解决方案1】:

我的建议是通过取对数来修改公式(即将公式与项的乘积转换为每个项的对数之和),然后取结果的指数。

【讨论】:

    【解决方案2】:
    1. 使用math.exp:

      100 / math.exp((x-2000)**2))**1/16
      

      这比e** 的性能和数值更准确。

    2. 请注意,...**1/16 可能不会做你想做的事。 **/higher operator precedence,所以上面等价于(...**1)/16。将分数括在括号中:

      100 / math.exp((x-2000)**2)**(1/16.0)
      

      以浮点格式 (16.0) 写入 16 以防止整数除法。

    3. 使用指数规则合并1/16

      100 / math.exp((x-2000)**2/16.0)
      

      这减少了大参数,有助于提高精度。

    4. 翻转参数的符号并将除法更改为乘法:

      100 * math.exp(-(x-2000)**2/16.0)
      

      这将在极端情况下下溢而不是上溢。在这种情况下,下溢表现得更好——你只会得到零而不是OverflowError

    【讨论】:

    • 如果编译器不为您做,我建议将 2/16 更改为 0.125。
    • @duffymo **/ 具有 higher precedence;这样做是否真的有帮助(性能或准确性)?
    • 没有人会注意到任何性能问题。我担心整数与浮点除法。当我在 Python REPL 中输入 2/16 时,它返回零而不是 1/8 = 0.125。看起来我正在运行 Python 2.7.15。
    • @duffymo 你是对的,谢谢你的收获;我假设** 会转换为浮点数。
    • 我很乐意提供帮助。编辑你的答案。
    猜你喜欢
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2015-11-13
    • 2019-03-20
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多