expm1 是正确的原语吗?

计算科学 浮点 一体化 特殊功能
2021-12-13 05:52:13

我正在写一些代码来计算01eaxdx. 令人讨厌的是,如果没有if声明,似乎没有办法做到这一点:

def my_integral(a):
    if a == 0:
        return 1.
    else:
        return expm1(a)/a

(我知道与零比较看起来令人担忧,但这正确地返回1了类似的值1e-50

这让我思考;expm1确实是标准的,但为什么不是正确的原语expm1_over(x) = expm1(x)/x

expm1_over可以做所有可以做的事情expm1,甚至更多。

我错过了一些缺点吗?

2个回答

是的,这是非常有争议的ex1x是“一样正确” expm1它经常出现在应用程序中;例如,参见 Higham 的矩阵函数的第 2.1 节和第 10.7.4 节,其中提到了指数积分器和矩阵函数;这个函数被调用ψ1(x)那里。你的例子,积分指数,是另一个例子,它在概率应用中也非常相关。就个人而言,我遇到过ψ1expm1我的研究更频繁。

正如@WolfangBangerth 在他的回答中指出的那样,这在实践中并不是什么大不了的事,因为可以以较高的相对准确度从另一个计算出来。在我看来,唯一的烦恼就是你指出的那个。

expm1是原始的,因为对于小x,泰勒级数为ex=1+x+x2+将小项添加到一个 - 这意味着如果x足够小,除了前导数字之外,您几乎会丢失所有精度数字,因此表达式ex1不能通过首先评估指数来准确计算。

您碰巧有一个需要其他原语的应用程序这一事实不会影响expm1. 但是,我要指出,没有理由发明您的expm1_over原语,因为(e^x-1)/x可以先使用expm1原语,然后使用除法来准确计算操作,而不会损失准确性。