R 为什么(e^x-1)/x不能正常工作,而(e^x-1)/log(e^x)却能正常工作?

R 为什么(e^x-1)/x不能正常工作,而(e^x-1)/log(e^x)却能正常工作?,r,floating-point,computation,rounding-error,R,Floating Point,Computation,Rounding Error,我想问一个问题,为什么对非常接近零的数字计算(e^x-1)/x的值不能正常工作(例如,如果x=10^-15,结果是1.1102230),但当我使用公式(e^x-1)/log(e^x),这是数学上等价的,它给了我1.000000的正确结果。谢谢。既然这是一个R问题,那么通过调用expm1(x)计算exp(x)-1如何?expm1()是一个R函数,设计用于返回exp(x)-1的精确值,即使对于接近0的x值也是如此。expm1(x)/x给出了正确的答案。问题在于,第一个函数显示了所谓的灾难性抵消:对于

我想问一个问题,为什么对非常接近零的数字计算(e^x-1)/x的值不能正常工作(例如,如果x=10^-15,结果是1.1102230),但当我使用公式(e^x-1)/log(e^x),这是数学上等价的,它给了我1.000000的正确结果。谢谢。

既然这是一个R问题,那么通过调用expm1(x)计算exp(x)-1如何?expm1()是一个R函数,设计用于返回exp(x)-1的精确值,即使对于接近0的x值也是如此。expm1(x)/x给出了正确的答案。

问题在于,第一个函数显示了所谓的灾难性抵消:对于接近0的x,ex非常接近1+x。由于浮点数在1附近的密度小于0,因此表达式的结果− 1将非常接近x,但由于中间舍入而失去准确性

第二种方法利用了“消除”舍入误差的巧妙技巧。事实上,尼古拉斯·J·海厄姆(Nicholas J.Higham)的优秀著作《数值算法的准确性和稳定性》中详细介绍了这个特殊的例子。他解释的关键是

表达式(例如− 1) 对于给定的x,无法准确计算/x≈ 在浮点运算中为0,而表达式(y− 1) /logy可以针对给定的y进行精确计算≈ 1.由于这些函数在x=0(y=1)附近缓慢变化,因此− 1) /log y,精确(如果不精确)近似于y=ex≈ 1产生准确的结果


你试过(e^(x-1))/x吗?但是这个公式应该和(e^(x)-1)/x写的完全一样,你可能会在浮点日志(e^x)中看到因此,计算是不同的。试着把每一个操作都打印出来。这难道不只是对使用精度有限的浮点数的局限性的抱怨吗。有些软件包支持更高的精度。@GmloMalo OP问题中的
log
实际上是自然对数(以e为底)。在数学中,它写为
ln
,但在编程语言中,它实际上总是写为
log
。(尽管数学中的
log
通常被视为以10为底的对数平均值…)这个例子是由卡汉(Kahan)给出的,他用这个例子来说明他所谓的反定理:一个被广泛相信和教授的定理,但它是错误的。William M.Kahan,“拟议IEEE浮点算术标准中的区间算术选项”。摘自:卡尔·L·E·尼克尔主编,《区间数学》,1980年,学术出版社,1980年,第99-128页。参见第110页的“反定理1”。