2010-08-01 65 views
3

Vincent通过暗示该功能回答了Fast Arc Cos algorithm棘手的算术或手术吗?

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

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

+0

**注意:**显然这里提供的解决方案并不完全正确,但问题仍然存在。 – 2010-08-01 05:36:16

回答

3

只有当(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)是文森特的arccos实现。他们都是关闭的pi/2,线性近似是得到至少这三点正确的是

g(x) = (1 - x) * pi/2 
+0

我仍然不知道精密零件的损失,请您举个例子吗? – 2010-08-01 05:48:22

+0

@David,试试'1.0 - (1.0 + 1e-16)'vs' - (1e-16)' – Anycorn 2010-08-01 05:56:52

+0

看一看[acos]的图形(http://www.mathworks.com/access/helpdesk /help/techdoc/ref/acos.gif) - 一个更好的线性近似(基于x = 0处的切线)将是'g(x)= pi/2 - x',除非x接近-1或1 – 2010-08-02 20:38:40

0

我看不到的细节瞬间,但想想为x发生了什么接近1或-1从任何一方,并考虑舍入误差。

0

加法导致两个数字都归一化(在这种情况下,与x有关)。 IIRC,在Knuth的第2卷的关于浮点运算的章节中,您甚至可以看到像x + 0这样的表达式。