Как я могу справиться со странными ошибками при вычислении acos/sin/atan2?
Вопрос
Кто-нибудь видел это странное значение при обработке sin/cos/tan/acos..математические штучки?
===СТРАННАЯ ЦЕННОСТЬ===
-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.
Но проблема в том, Попробуйте и поймать не работает, потому что эти двойные переменные успешно сохранили некоторые значения в них.
Более того, Следующие расчеты никогда не жалуются на это и никогда не нарушают программу!
Я подумываю о том, чтобы как-то заставить использовать это значение и привести к сбою всей программы...Чтобы я мог поймать эту ошибку..
Кроме этой идеи, я понятия не имею Как мне следует проверить, сохранили ли эти переменные theta_one и theta_two эти сумасшедшие значения.
Есть хорошие идеи?
Заранее спасибо..
Решение
«Странная ценность» — это НЭН (не число).
Проблема в том, что (L2*L2 - B*B - L1*L1) / (-2*B*L1) = 6.08112…
находится за пределами диапазона [-1, 1], где acos четко определен для действительных чисел.Итак, NaN возвращается.
Вы уверены, что формула верна?
Если вы хотите перехватить NaN, NaN должен быть сигнальным NaN.Для gcc скомпилируйте с помощью -fsignaling-nans
вариант.