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

时间:2018-10-19 09:48:04

标签: floating-point

在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的实现?

1 个答案:

答案 0 :(得分:1)

这是因为您的第二个表达式是错误的。它应该是 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的差异很小,通常不值得使用泰勒级数。