merci
xavier
merci
xavier
Mais de rien. Voici les règles:
http://club.developpez.com/regles/
bonjour,
je fais une petite routine qui doit utiliser Pi.
Cette variable est-elle définie en C++?
Xavier
Salut !
Oui, va voir du côté de math.h, il y a une variable M_PI je crois...
a+
C'est une macro demandee par Posix mais pas par la norme du C++ (ni du C). Je ne sais pas combien cette definition est repandue en dehors des Unix.Envoyé par mathieu_t
Salut
Pour être sur qu'elle soit définie, tu peux ajouter cette définition dans le fichier qui l'utilise (ou dans un header qui convient) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #ifndef M_PI #define M_PI 3.14159265358979323846 #endif
En tout cas je l'ai déjà utilisé sous Windows, avec C++ Builder il me semble...Envoyé par Jean-Marc.Bourguet
Sous VC++ par défaut elle passe pas, y'a un #define à faire (_USE_MATH_DEFINES).
Histoire d'être constructif, tu voudrais pas proposer une solution qui marcherait avec n'importe quel compilateur ?Envoyé par VoidSeer
Je sais, un #define c'est pas top, ça serait mieux de faire quelque chose du type:La solution du define permet juste de rester "plus ou moins" standard (rappel: C'est une macro demandee par Posix), en définissant M_PI quand il ne l'est pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part const double g_Pi = 3.14159265358979323846;
Mais vas y je t'en prie, propose autre chose ....
PI est une constante comme une autre. Y'a déjà eu pas mal de sujet sur 'comment éviter les #define' pour définir des constantes et pourquoi. C'est soit dans la FAQ, soit dans le forum
Oui merci je sais comment éviter les #define, et je suis le premier à dire qu'il faut privilegier les constantes. Mais en pratique, M_PI existe, il est "demandé" par la norme Posix, et quand il est défini, c'est généralement un par
(enfin les fois ou j'ai pu verifier)
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define M_PI 3.14159265358979323846
Après, on peut faire tout un débat sur "est-ce qu'il faut redéfinir une constante PI dans nos programmes ou utiliser le #define fourni par <math.h>"
Enfin pour répondre à la question originale, tu as deux possibilités (entres autres surement):
J'espère que l'ambiance du post ne te découragera pas, c'est un très bon forum
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 const double g_Pi = 3.14159265358979323846; ou #ifndef M_PI #define M_PI 3.14159265358979323846 #endif![]()
J'ai eu le cas de PI y'a pas longtemps. Effectivement il est présent 'parfois' dans cmath.
Norme POSIX ou pas, il ne fait pas partie du langage en standad et franchement, se battre avec des #ifdef et compagnie j'ai trouvé ça plus que moyen.
<math.h> peut être inclus à partir de fichier C aussi, d'où le #define je pense. Mais si le projet est en C++, alors, une constante perso et un bon copier-coller de la valeur AMHA sont préférable.
Dans notre bibliothèque, toutes les constantes sont regroupée en tant que membre statiques d'une classe Math. Ca evite les defines, et les déclarations qui se baladent.
Oui ok, je suis d'accord, c'est surement préférable. J'ai proposé ça puisque on parlait justement de #define M_PI qui était parfois présent...
Enfin par contre j'aurai mis tout ça dans un namespace plutôt que statique dans une classe (suite à une remarque judicieuse qu'on m'avait faite ici il y a un moment, d'ailleurs).
Par contre je ne comprends pasPourquoi la constante ne marcherait pas aussi en C ? Ou alors est-ce qu'il y a un lien fort C / Posix ?<math.h> peut être inclus à partir de fichier C aussi, d'où le #define je pense
Enfin c'est dommage qu'une bilibothèque "standard" utilise des techniques peu recommendables !
Enfin sinon, ok, let's settle for const double Pi![]()
namespace ou classe, ça ne change rien. Sauf pour la cohérence globale et la doc.
Personnellement, je n'aime pas avoir des données qui se baladent en dehors d'un objet, mais c'est plus une question de style.
Quand au pourquoi la constante ne marcherais pas en C. Je pense que M_PI a été introduit à une époque ou le mot-clef 'const' n'existait pas en C.
Ben on peut pas définir une constante dans un .h.
Ah bah oui![]()
Sinon pour le namespace, c'est vrai que c'est une question de style. Quand on m'avait préconisé ça (il y a longtemps), je ne me souviens pas d'arguments particuliers niceau performance ou autre ....
D'ailleurs, est-ce que la recherche dans le forum est "limitée" en temps ? Je ne retrouve plus le topic en question ....![]()
Partager