Как я могу обработать странные ошибки при вычислении acos / sin / atan2? - PullRequest
1 голос
/ 25 марта 2010

Кто-нибудь видел это странное значение при обработке sin / cos / tan / acos .. math stuff?

=== странное значение ===

-1. # IND00

=====================

void inverse_pos(double x, double y, double& theta_one, double& theta_two)
{
    // Assume that L1 = 350  and L2 = 250


    double B = sqrt(x*x + y*y);
    double angle_beta = atan2(y, x);
    double angle_alpha = acos((L2*L2 - B*B - L1*L1) / (-2*B*L1));
    theta_one = angle_beta + angle_alpha;
    theta_two = atan2((y-L1*sin(theta_one)), (x-L1*cos(theta_one)));
}

Это код, над которым я работал.

В определенном состоянии, например, когда x & y равны 10 и 10, этот код сохраняет -1. # IND00 в theta_one & theta_two .

Оно не похоже ни на символы, ни на цифры: (

Без сомнения, atan2 / acos / stuff - это проблемы.

Но проблема в том, что try and catch тоже не работает Потому что эти двойные переменные успешно сохранены некоторые значения в них .

Более того, следующие вычисления никогда не жалуются на это и никогда не ломайте программу !

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

За исключением этой идеи, я не знаю, как мне проверить, Переменные theta_one и theta_two сохранили эти сумасшедшие значения.

Есть хорошие идеи?

Заранее спасибо ..

1 Ответ

10 голосов
/ 25 марта 2010

«Странное значение» равно NaN (не число).

Проблема в том, что (L2*L2 - B*B - L1*L1) / (-2*B*L1) = 6.08112… находится вне диапазона [-1, 1], где acos четко определено для действительных чисел Так что NaN возвращается.

Вы уверены, что формула верна?


Если вы хотите поймать NaN, NaN должен быть сигнальным NaN. Для gcc скомпилируйте с опцией -fsignaling-nans.

...