2016-03-08 1 views
-3

La réponse de cette fonction est retournée dans la fonction principale du programme, et cela fonctionne très bien. Le problème est que toute valeur où le cosinus devrait être 0, il s'avère que cela donne un nombre irrationnel étrange (quelque chose comme 1.30431912 * 10^-13). Donc, 90, 450, et ainsi de suite, tous donnent des réponses irrationnelles. Quel est le problème?Réponse de la fonction est incorrecte

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 n'est pas exactement 3.14159265359, n'est-ce pas? – stijn

+1

1.30431912 * 10^-13 n'est pas irrationnel. C'est parfaitement rationnel, mais très proche de zéro. C'est aussi proche de zéro que vous êtes susceptible d'obtenir. Voir aussi [Est-ce que le calcul à virgule flottante est rompu?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken). – molbdnilo

Répondre

3

Le calcul en virgule flottante a une précision finie. Votre valeur (PI/180)*iDouble est environ 1.30E-13 radian loin de 90 degrés.

+0

Donc, c'est aussi précis que je peux vraiment obtenir des choses, alors? – Rocky

+0

Je pense que cela aiderait le PO à présenter également une solution, ou une explication sur la façon d'en fabriquer un. – stijn

+0

@stijn: La question semble demander une explication, pas une solution, et c'est quand même non-trivial. cos (45) ne va pas retourner √2. – MSalters

1

Si vous verrouillez Pi avec une précision limitée, vous ne pouvez pas vous attendre à ce que votre 'réponse' soit plus précise. 10^-13 est fondamentalement zéro en fait, et ce n'est pas «irrationnel». Tout est rationnel dans un ordinateur.

+0

Très bien. Merci. – Rocky

+0

Eh bien, 'std :: complex' n'est pas rationnel;) – MSalters