最小化分数平方根的舍入误差



在 R 中我有

options(digits=22)
sqrt((1-exp(-20)))/sqrt((1-exp(-19.9)))
> 1.000000000108386855047
sqrt((1-exp(-20))/(1-exp(-19.9)))
> 1.000000000108386633002

我的问题是:我是否可以期望一个版本比另一个版本更精确(也使用其他语言(,还是取决于除法和sqrt的实施?

这是因为你的第二个表达式是错误的。它应该是sqrt((1-exp(-10))/(1-exp(-9))),你计算了一个值的平方根,比如1-a/(1-b)而不是(1-a)/(1-b(。

通过此更改,两个结果都1.000039008990497


这是更新的答案:对于小x来说,计算sqrt(1-x)有点不准确。为了获得稍微好一点的结果,您可以使用泰勒级数sqrt(1-x) ~ 1 - x/2(或更高的项,取决于 x 的值(近似。

> x = exp(-20)
> y = exp(-19.9)
> sqrt((1-x)/(1-y))
[1] 1.0000000001083866
> sqrt(1-x)/sqrt(1-y)
[1] 1.0000000001083869
> (1-x/2)/(1-y/2)
[1] 1.0000000001083866

正确的舍入值是1.0000000001083867。您可以看到泰勒级数值与第一个值相同。IMO的差异非常小,通常不值得使用泰勒系列。

最新更新