文森特回答了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 比 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
关于c++ - 棘手的算术或手法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3380827/