проблемы с cMath и функцией sin

Итак, я занимаюсь графической математикой и вставляю то, что, как мне кажется, является числом с плавающей запятой (я почти уверен, что способы, которыми я заранее манипулировал числом с плавающей запятой, что-то испортили...) в функцию и получаю странные отрицательные результаты.

например, при выполнении следующих операций, когда Угол изначально равен 350,0, тест заканчивается
-0,99. Почему?

Angle= (float)(Angle-(int)Angle)+(float)((int)Angle%90); 

// calculates x and y based on angle and Hypotenuse
float test= sin(Angle);
float test2= 1/(Speed*Time);
float test3= test/test2;
buffX= sin(Angle)/ (1.f/(Speed*Time));
buffY= sin(Angle-90)/ (1.f/(Speed*Time));

пытаясь сохранить Angle с плавающей запятой, поставив (float) до того, как все не сработало ... пожалуйста, помогите! Спасибо!


person Griffin    schedule 16.06.2011    source источник


Ответы (2)


Это связано с тем, что функция среды выполнения C/C++ sin() ожидает аргумент в радианах, а не в градусах.

Преобразовать в радианы с помощью:

float test= sin(Angle / 180 * M_PI);

и т.п.

person wallyk    schedule 16.06.2011

sin принимает аргументы в радианах, а не в градусах. Вам нужно взять свое число и умножить его на пи/180.

person jpm    schedule 16.06.2011
comment
Для лучшей точности начните с уменьшения по модулю, затем преобразуйте значение в октант, а затем преобразуйте угол от 0 до 45 градусов в от 0 до pi/2 радиан. В противном случае некоторые математические библиотеки могут сообщить, что синус 180 градусов не совсем равен нулю [и, возможно, зайдет так далеко, что потратит время, пытаясь точно вычислить, насколько он далек от нуля]. - person supercat; 04.06.2014