Почему sin (45) и cos (45) дают разные результаты? [Дубликат]
На этот вопрос уже есть ответ:
Математика с плавающей точкой нарушена? 28 ответов Этого я и не ожидал. Я знаю, что эти цифры не являются точными на 100%, но я не ожидал, что дополнительные углы дадут разные результатыsin
а такжеcos
:
Эта следующая функция возвращает0.70710678118654746000000...
sin(45 * PI / 180.0);
пока эта функция возвращает0.70710678118654757000000...
cos(45 * PI / 180.0);
так что это
0.707106781186547**46**000000... vs
0.707106781186547**57**000000...
и не только те ...sin(1 * PI / 180.0)
также возвращает немного другое число, чемcos(89 * PI / 180.0)
хотя они должны быть одинаковыми.
Более того, это не толькоsin
противcos
проблема, это тожеsin
противsin
проблема:sin(1 * PI / 180.0)
возвращает значение, отличное отsin(179 * PI / 180.0)
опять они должны быть одинаковыми.
Я пытался использовать радианы, а не градусы, и разница точно такая же, я пытался использовать маленькое значение PI, огромное значение PI (около 100 десятичных знаков и более), и они все еще разные, я пытался использоватьcmath
вместо тогоmath.h
, Я пытался использоватьM_PI
вместоPI
определил сам.
Разница всегда одна и та же, около 16-го знака после запятой. Не поймите меня неправильно, я знаю, что никогда не получу 100% точное значение этих чисел, но, по крайней мере, я ожидал получить такое же "неточное" значениеsin
а такжеcos
дополнительных углов. Что, черт возьми, не так со всем этим?
Мне нужно, чтобы они были такими же, потому что программа, над которой я работаю (симулятор гравитации меня попросили), использует объекты, которые имеютdouble
(Я тоже пробовалfloat
) переменные, которые в основном являются углами (градусы или радианы, я пробовал оба). Это те направления, по которым объекты перемещаются, также мне нужны углы для расчета взаимодействия между объектами.
Углы меняются на каждой итерации программы, и на каждой итерации углы изменяются в зависимости от вычислений на углах предыдущей итерации, поэтому, если в любой точке есть какое-либо минимально неправильное значение угла, эта ошибка усиливается все больше и больше в каждая итерация.
Программа выполняет тысячи и даже миллионы итераций, поэтому ошибка значения становится невероятно огромной! Проще говоря, планеты в конечном итоге выходят из равновесия, и все становится катастрофой, я действительно злюсь:
P.s. Я на Windows 7, 32 бита.