Vincent通过建议这个功能回答Fast Arc Cos algorithm。
float arccos(float x)
{
x = 1 - (x + 1);
return pi * x / 2;
}
问题是,为什么x = 1 - (x + 1)
而不是x = -x
?
答案 0 :(得分:3)
仅当(x + 1)导致精度损失时才返回不同的结果,即x大于或小于1的数量级。
但我不认为这是棘手的或手法,我认为这只是简单的错误。
cos(0) = 1 but f(1) = -pi/2
cos(pi/2) = 0 but f(0) = 0
cos(pi) = -1 but f(-1) = pi/2
其中f(x)
是Vincent的arccos
实施。所有这些都在pi/2
之外,这是一个线性近似值,至少可以得到这三个点是正确的
g(x) = (1 - x) * pi / 2
答案 1 :(得分:0)
我没有立即看到细节,但想想当x从任何一方接近1或-1时会发生什么,并考虑舍入错误。
答案 2 :(得分:0)
添加导致两个数字都被标准化(在这种情况下,与x相关)。 IIRC,在Knuth的第2卷中,在关于浮点运算的章节中,你甚至可以看到像x + 0这样的表达式。