2012-02-19 2 views
3

J'écris un programme qui utilise les fonctions sin() et cos() de la bibliothèque math.h. Cependant, j'ai remarqué que je recevais des résultats funky. Après avoir cherché autour et vérifier mes calculs plusieurs fois, je décide de faire une simple vérification avec ceci:Problèmes avec math.h

int main() 
{ 
    cout << "sin(45.0) = " << sin(45) << endl; 
    cout << "cos(45.0) = " << cos(45) << endl; 

    return 0; 
} 

Et je reçois cette sortie:

sin(45) = 0.850904 
cos(45) = 0.525322 

Ceux-ci devraient être égaux à droite? Y a-t-il quelque chose de spécial à propos de la bibliothèque math.h? Est-ce que je fais quelque chose de mal?

Voici les équations WolframAlpha:

sin(45)

cos(45)

Répondre

9

Vous devez utiliser cmath en C++ plutôt que l'ancien en-tête C. Tous les deux prennent une valeur à virgule flottante représentant un angle en radian

std::sin() et std::cos().

The GCC version of this file includes a handy constant for π, (qui n'existe pas dans le C++ standard, mais) qui sera plus facile pour vous de convertir les degrés en radians:

#include <cmath> 
#include <iostream> 

double degrees_to_radian(double deg) 
{ 
    return deg * M_PI/180.0; 
} 

int main() 
{ 
    std::cout << "sin(45.0) = " << std::sin(degrees_to_radian(45)) << std::endl; 
    std::cout << "cos(45.0) = " << std::cos(degrees_to_radian(45)) << std::endl; 
} 

See it run!

+1

Problème de précision à 90 degrés! http://ideone.com/KOxs8d – Patric

5

fonctions trigonométriques utilisent radians, non degrés.

+0

Eh bien c'est embarrassant. Mais merci :) –

8

sin et cos attendez l'entrée en radians et non en degrés.
essayez ceci:
sin(degrees * pi/180)

2

sin() et cos() traiter votre paramètre comme radians pas de diplômes.

0

Son étrange parce que je ne peux pas 0 quand en utilisant cos (1.5707963267948966) qui est la valeur de radian pour 90 degrés.

long double degrees = 90.0; 
    long double radians = glm::radians(degrees); 
    long double result = cos(radians); 

Le résultat est égal à 6.1232339957367660e-017 - Je ne plaisante pas. glm calcule aussi correctement les radians, vérifie-le par rapport à google. J'ai utilisé de longs doubles pour m'assurer que ce n'était pas en quelque sorte des problèmes d'arrondis mais ce n'est pas le cas. Juste pensé que cette information pourrait aider d'une manière ou d'une autre

+0

La raison pour laquelle vous n'obtenez pas zéro lors de l'évaluation de 'cos (1.5707963267948966)' est parce que '1.5707963267948966' est une approximation décimale de 90º. L'équation pour convertir 90º en radians est ['90 * (pi/180)'] (https://www.wolframalpha.com/input/?i=90* (pi% 2F180)). Parce que pi ne peut pas être représenté entièrement par un ordinateur, vous allez en avoir quelques-uns qui devront être arrondis. Donc, vous serez vraiment proche de zéro, mais pas exactement zéro. Vous pouvez le voir dans votre résultat - '6.1232339957367660e-017' - qui est vraiment proche de zéro. –

+0

Ohh, ne s'est pas rendu compte que 6.1232339957367660e-017 était vraiment proche de zéro, merci pour la réponse, est tout à fait logique maintenant! – Tomster954

+0

Pas de problème, content de pouvoir aider! –