Неверные результаты из тригонометрических функций математической библиотеки C ++ - PullRequest
0 голосов
/ 20 ноября 2011

В настоящее время я работаю над личным проектом, которым я занимаюсь почти год. Я пытаюсь перенести его в среду Windows, что удалось. Поскольку я пытаюсь в скором времени разослать людям версию для Windows, я решил продолжить разработку в Windows, в то время как я пытаюсь добавлять новые функции и выявлять ошибки, которые существовали в течение многих месяцев. Недавно, пытаясь добавить функциональность, в значительной степени опирающуюся на тригонометрию, я обнаружил, что все три тригонометрические функции, как ни странно, возвращали одно и то же значение (1072693887) независимо от параметра, который я передавал. Как вы можете себе представить, это приводит к некоторым довольно странным ошибкам в системе.

Я включил math.h, и, насколько мне известно, нет других файлов, которые бы содержали эту функцию. (Возможно, есть команда отладчика, чтобы найти, где определен символ? Я не смог найти ничего подобного, но, возможно, я что-то упустил.) Я пытался искать в других местах и ​​искать в Google, но безрезультатно ...

Кто-нибудь еще слышал об этой проблеме раньше или знает, как ее исправить?

Ответы [ 4 ]

5 голосов
/ 20 ноября 2011

РЕДАКТИРОВАТЬ: Этот ответ не имеет значения.См. Комментарии.


Вероятно, это связано с числовой нестабильностью.

Когда вы передаете такое большое значение в sin(), cos() или любой из периодическихтриг функции, вы должны помнить, что есть неявный модуль по 2*pi.

Если вы используете float, то неопределенность 1072693887, намного больше, чем 2*pi.Поэтому, какой бы результат вы ни получили, это мусор.

Нам нужно будет увидеть какой-то код, чтобы точно видеть, что происходит.

РЕДАКТИРОВАТЬ: Вот иллюстрация:

sin(1072693886) =  0.6783204666
sin(1072693887) = -0.2517863119
sin(1072693888) = -0.9504019164

Но если тип данных float, то неопределенность 1072693887 равна +/- ~64 ...

2 голосов
/ 20 ноября 2011

1072693887 - это 3FF207FF в шестнадцатеричном формате, что соответствует 1,8908690 в IEEE с плавающей точкой одинарной точности.Вы уверены, что ваша проблема не только в представлении, то есть вы приводите или просматриваете результат как целое число?

0 голосов
/ 21 ноября 2011

Все, что я знаю, это то, что GDB сообщает мне, что результат 1072693887, это происходит со всеми 3 моими функциями триггера (и что версии дуги всех трех из них просто возвращают -1072693887) независимо от того, какой параметр пройти.

Может быть, проблема GDB. Что произойдет, если вы просто вручную распечатаете значения в консоли?

0 голосов
/ 20 ноября 2011

Математическая библиотека в порядке.

Вы понимаете, что функции ожидают радианы в качестве входных данных?

Например:

double param = 90.0;
double rads = param * M_PI/180;
std::cout << std::fixed << "Angle : " << param << " sin : " << sin (rads) << " cos " << cos(rads);

Выход:

Angle : 90.000000 sin : 1.000000 cos 0.000000-0.304811
...