Vincent通过建议此功能回答了Fast Arc Cos algorithm。
float arccos(float x)
{
x = 1 - (x + 1);
return pi * x / 2;
}
问题是,为什么是
x = 1 - (x + 1)
而不是x = -x
? 最佳答案
仅当(x +1)导致精度损失时,即x大于或小于一个数量级时,它才返回不同的结果。
但是我不认为这是棘手的技巧,而是简单的错误的。
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