如何以数值稳定的方式计算(exp(t)-1)/t



t趋向于0时,表达式(exp(t) - 1)/t收敛于1。然而,当用数字计算时,我们得到了一个不同的故事:

In [19]: (exp(10**(-12)) - 1) * (10**12)                                        
Out[19]: 1.000088900582341
In [20]: (exp(10**(-13)) - 1) * (10**13)                                        
Out[20]: 0.9992007221626409
In [21]: (exp(10**(-14)) - 1) * (10**14)                                        
Out[21]: 0.9992007221626409
In [22]: (exp(10**(-15)) - 1) * (10**15)                                        
Out[22]: 1.1102230246251565
In [23]: (exp(10**(-16)) - 1) * (10**16)                                        
Out[23]: 0.0

有没有什么方法可以在不遇到这些问题的情况下计算这个表达式?我曾想过使用幂级数,但我对自己实现这一点很谨慎,因为我不确定实现的细节,比如要使用多少术语。

如果相关的话,我将Python与scipy和numpy一起使用。

评论中关于微小值的讨论似乎毫无意义。如果t太小而导致下溢,则表达式为1";自从很长一段时间以来";。事实上,泰勒的发展是

1 + t/2 + t²/6 + t³/24...

并且一旦t < 1 ulp,浮点表示就恰好是1

除此之外,expm1(t)/t将做得很好。

最新更新