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

StackOverflow https://stackoverflow.com/questions/2513897

  •  22-09-2019
  •  | 
  •  

Вопрос

Кто-нибудь видел это странное значение при обработке 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 вариант.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top