2016-03-08 5 views
-3

Ответ этой функции возвращается в основную функцию программы, и это работает нормально. Проблема в том, что любое значение, где косинус должен быть 0, оказывается, дает странное иррациональное число (что-то вроде 1.30431912 * 10^-13). Итак, 90, 450 и т. Д., Все получается иррациональными ответами. Что случилось?Ответ от функции неверен

float cosineDegrees() { 
     string i; 
     double iDouble; 

     cout << "Give me a number to find the value of degrees in. "; 
     getline(cin, i); 

     iDouble = stod(i); 

     double PI = 3.14159265359; 

     float answer = cos((PI/180)*iDouble); 

     return answer; 


    } 
+0

pi не совсем 3.14159265359, не так ли? – stijn

+1

1.30431912 * 10^-13 не является иррациональным. Это совершенно рационально, но очень близко к нулю. Это как можно ближе к нулю, как вы, вероятно, получите. См. Также [Является ли математика с плавающей запятой?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken). – molbdnilo

ответ

3

Математика с плавающей запятой имеет конечную точность. Ваше значение (PI/180)*iDouble составляет около 1,30E-13 радиан от 90 градусов.

+0

Значит, так точно, что я действительно могу получить вещи? – Rocky

+0

Я думаю, что это поможет OP также представить решение или объяснение того, как его создать. – stijn

+0

@stijn: Вопрос заключается в том, чтобы попросить объяснение, а не решение, и нетривиальность таста. cos (45) не вернется √2. – MSalters

1

Если вы заблокируете Pi с ограниченной точностью, вы не можете ожидать, что ваш «ответ» будет более точным. Фактически, 10^-13 фактически равен нулю, и это не «иррационально». В компьютере все рационально.

+0

Хорошо. Благодарю. – Rocky

+0

Ну, 'std :: complex' не рациональен;) – MSalters