OVH Cloud OVH Cloud

Pas de M_PI ??

24 réponses
Avatar
Florent 'flure' C.
Bonjour,

je crains fort d'être hors charte, mais bon tant pis pour moi, je pose
quand même ma question.

dans math.h, j'ai ceci :

#if defined __USE_BSD || defined __USE_XOPEN
...
# define M_PI 3.14159265358979323846 /* pi */
...
#endif

puis plus loin :
#ifdef __USE_GNU
...
# define M_PIl 3.1415926535897932384626433832795029L /* pi */
...
#endif

Et dans mon programme, j'ai besoin d'une constante PI, même sans grande
précision (donc M_PI suffirait, mais 3.14 serait un peu juste). Hors, que
j'utilise M_PI ou M_PIl, le compilateur me dit :

pqtorus.c:40: error:`M_PIl' undeclared (first use in this function)

J'ai bien sur #includé math.h.

Dois-je définir l'une ou l'autre des constantes __USE_BSD, __USE_XOPEN,
__USE_GNU ? Ça ne me paraîtrait pas très propre ... Ou bien s'agit-il
d'une option de compilation qui me manque ?
Pour info j'utilise -Wall -std=c99 avec gcc3.3.4 (sous Debian si ça peut
avoir une quelconque importance).

Merci d'avance pour toute aide qui me serait précieuse.

--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !

10 réponses

1 2 3
Avatar
Florent 'flure' C.
Le Sat, 18 Sep 2004 15:56:34 +0200, Anthony Fleury a écrit :

Jean-Marc wrote:

Au passage, et pour répondre à un post précédent, faire un #define
M_PI    4 *atan(1.0)
me semblait aussi une trèès mauvaise idée! pourquoi obliger le
programme à recalculer PI à chaque fois ? PI me semble avoir une
valeur bien constante, non ?


C'est en effet la plus mauvaise méthode pour pallier au fait que l'ont
ait pas le droit de définir des variables globales avec autre chose que
des constantes littérales en C.


En fait j'a choisi cette méthode finalement :

#ifndef M_PI
const double M_PI = 3.14159265358979323846;
#endif

dans un .h inclus presque partout.

J'espère qu'il n'y a pas de contre-indications à cela ?

Cependant, si Pi est utilisé dans des gros calculs (donc propagation
rapide de l'erreur) et un nombre raisonnable de fois, ca peut être une
solution. Le mieux est quand même, si la constante est utilisée dans une
fonction précise, de la définir en local, et là on ne la calcule qu'une
fois.


Je suis bien d'accord, mais dans mon cas la contrainte n'est pas la
précision, mais la performance (animation 3D), donc je ne peux pas me
permettre de calculer pi :)


--
Florent "flure" C.
Décrypter l'@ pour répondre
Coders don't die, they just JMP without RET !


Avatar
Jean-Marc
"Florent 'flure' C." a écrit dans le
message de news:


En fait j'a choisi cette méthode finalement :

#ifndef M_PI
const double M_PI = 3.14159265358979323846;
#endif

dans un .h inclus presque partout.

J'espère qu'il n'y a pas de contre-indications à cela ?


Non, c'est parfait.

--
Jean-marc

Avatar
Jean-Marc Bourguet
"Florent 'flure' C." writes:

En fait j'a choisi cette méthode finalement :

#ifndef M_PI
const double M_PI = 3.14159265358979323846;
#endif

dans un .h inclus presque partout.

J'espère qu'il n'y a pas de contre-indications à cela ?


Définir un symbole dont il est connu (et même attendu) qu'il
est communément utilisé comme macro à autre chose qu'une
macro me semble de très mauvais style.

La seule circonstance atténuante est que la valeur est la
même, mais bon...

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Emmanuel Delahaye
Anthony Fleury wrote on 18/09/04 :
#include <math.h>

(static) const double pi = 4*atan(1.0);


Pas du C.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
Florent 'flure' C. wrote on 18/09/04 :
Hello,
c'est normal, ce n'est pas autorisé d'initialiser quelque chose avec
autre chose qu'une constante.
(mon compilateur me dit: 'initializer is not a constant'

pour quoi faire super compliqué, qd on peut faire: static const double
monPI = 3.141592657;


En fait, comme c'est une constante dont j'ai besoin dans la plupart des
fichiers de mon (petit) projet, je voulais utiliser la constante de math.h
comme il me semblait avoir toujours fait jusqu'à maintenant ...
Je vais néanmoins opter pour cette option ...
Par contre, est-ce une mauvaise idée d'appeler cette constante M_PI,
comme dans math.h ?


Aucun problème:

#ifndef M_PI
#define M_PI 3.141592657
#endif

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
Emmanuel Delahaye
Florent 'flure' C. wrote on 18/09/04 :
#ifndef M_PI
const double M_PI = 3.14159265358979323846;
#endif

dans un .h inclus presque partout.


Chez moi, cet include s'appelerai pi.h. Comme ça, c'est clair...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
(supersedes )

Florent 'flure' C. wrote on 18/09/04 :
Hello,
c'est normal, ce n'est pas autorisé d'initialiser quelque chose avec
autre chose qu'une constante.
(mon compilateur me dit: 'initializer is not a constant'

pour quoi faire super compliqué, qd on peut faire: static const double
monPI = 3.141592657;


En fait, comme c'est une constante dont j'ai besoin dans la plupart des
fichiers de mon (petit) projet, je voulais utiliser la constante de math.h
comme il me semblait avoir toujours fait jusqu'à maintenant ...
Je vais néanmoins opter pour cette option ...
Par contre, est-ce une mauvaise idée d'appeler cette constante M_PI,
comme dans math.h ?


Aucun problème:

#ifndef M_PI
#define M_PI 3.14159...
#endif

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
Jean Claude Calvez
"Richard Delorme" a écrit dans le message de news:
414c459b$0$15754$

static const double monPI = 3.141592657;


TonPi a une drôle de valeur...
C'est plutôt, en arrondissant : 3.141592654
Pour plus de précision :
http://www.joyofpi.com/pi.html


Cette adresse internet n'est pas indispensable pour
connaître la connaître la valeur de pi à 10 chiffres.
N'importe quelle calculatrice scientifique fait
l'affaire. :-))


--
Richard


JCC


Avatar
Vincent Lefevre
Dans l'article <414c2d80$0$12988$,
Anthony Fleury écrit:

(static) const double pi = 4*atan(1.0);


Outre le fait que ce n'est pas du C, c'est idiot. Un simple #define
utilisant la valeur en dur (avec suffissamment de chiffres) est
suffisant en pratique.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

Avatar
Vincent Lefevre
Dans l'article <cihtnp$sor$,
Jean Claude Calvez écrit:

"Richard Delorme" a écrit dans le message de news:
414c459b$0$15754$

C'est plutôt, en arrondissant : 3.141592654
Pour plus de précision :
http://www.joyofpi.com/pi.html


Cette adresse internet n'est pas indispensable pour
connaître la connaître la valeur de pi à 10 chiffres.
N'importe quelle calculatrice scientifique fait
l'affaire. :-))


Pour la double précision, il faut 17 chiffres. Et peu de calculatrices
savent les donner.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


1 2 3