棘手的算术或手法?

时间:2010-08-01 05:09:21

标签: c++ c math

Vincent通过建议这个功能回答Fast Arc Cos algorithm

float arccos(float x) 
{ 
    x = 1 - (x + 1); 
    return pi * x / 2; 
} 

问题是,为什么x = 1 - (x + 1)而不是x = -x

3 个答案:

答案 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这样的表达式。