Хитрая арифметика или ловкость рук? - PullRequest
3 голосов
/ 01 августа 2010

Винсент ответил Алгоритм Fast Arc Cos , предложив эту функцию.

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

Вопрос в том, почему x = 1 - (x + 1), а не x = -x?

Ответы [ 3 ]

3 голосов
/ 01 августа 2010

Он возвращает другой результат только тогда, когда (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 голосов
/ 01 августа 2010

Сложение приводит к тому, что оба числа нормализованы (в данном случае относится к х). IIRC, в томе 2 Кнута, в главе об арифметике с плавающей точкой, вы даже можете увидеть выражение, подобное x + 0.

0 голосов
/ 01 августа 2010

Я не вижу подробностей сразу, но думаю о том, что происходит, когда x приближается к 1 или -1 с любой стороны, и учту ошибку округления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...