PI

PI - C++ - Programmation

Marsh Posté le 18-03-2010 à 12:01:20    

Est-ce qu'il y existe une définition standard de Pi, quelque part en C++? Je sais qu'il y a M_PI dans <cmath>, mais j'avais lu quelque part que ce n'était pas standard.

Reply

Marsh Posté le 18-03-2010 à 12:01:20   

Reply

Marsh Posté le 18-03-2010 à 12:56:08    

dans math.h, on a aussi M_PI qui est défini par

#define M_PI  3.14159265358979323846


 
Sinon, on peut utiliser l'instruction fldpi du coprocessor mathématique présent sur la plupart des PC :

inline double PI()
{
double x; // memory location to pop to
__asm
{
fldpi; // Push pi onto the FPU register stack
fstp x; // Copy ST(0) to m64 real and pop register stack
}
return x
}

Message cité 2 fois
Message édité par olivthill le 18-03-2010 à 12:59:01
Reply

Marsh Posté le 18-03-2010 à 15:06:17    

Cool, mais c'est très portable ça?

Reply

Marsh Posté le 18-03-2010 à 15:34:08    

olivthill a écrit :

dans math.h, on a aussi M_PI qui est défini par

#define M_PI  3.14159265358979323846


 
Sinon, on peut utiliser l'instruction fldpi du coprocessor mathématique présent sur la plupart des PC :

inline double PI()
{
double x; // memory location to pop to
__asm
{
fldpi; // Push pi onto the FPU register stack
fstp x; // Copy ST(0) to m64 real and pop register stack
}
return x
}



 
pour la portabilité, c'est juste raté, ensuite, pour du C++, l'auteur du poste parle de <cmath> et il a raison d'oublier volontairement que certains compilos ont laissé l'on a l'accès à math.h à côté.
Bref, <cmath> est standard, c'est sur que les macros, c'est pas ce qu'il y a de plus sexy, mais tu es tout de même assuré de trouver ta constante partout


Message édité par theshockwave le 18-03-2010 à 15:39:55

---------------
last.fm
Reply

Marsh Posté le 18-03-2010 à 15:39:53    

mmm, en fait avant j'includais <math.h> et puis un jour Joel F m'a tapé et depuis j'include <cmath>...
 
Pour en revenir à M_PI, est-ce que je suis vraiment sûr de le trouver partout, parce que mon ami google me parle de plein de gens qui, justement ne le trouvent pas.

Reply

Marsh Posté le 18-03-2010 à 15:41:55    

Je vais me faire défoncer mais : 4*atan(1)

Reply

Marsh Posté le 18-03-2010 à 15:50:06    

je viens de survoler rapidement mon K&R et je vois pas de référence à M_PI dedans ...
Dans le projet sur lequel je bosse, le type qui a fait notre lib math a défini la constante à la main pour les floats.
 
En tout cas, effectivement, au pire des cas, tu le redéfinis, c'est pas la mer à boire et il y a peu de chance que la valeur vienne à changer un jour ...


---------------
last.fm
Reply

Marsh Posté le 18-03-2010 à 15:58:26    

M_PI est standardise par Posix mais pas par  C ni C++.
 
Perso j'utilise les versions sans c des entetes.  La raison est double:
- en pratique il n'y a pas de garantie sur les differences (C++0X revient sur ce que C++03 garantissait parce que ce n'est pas implementable sans controler la lib C et la lib C++)
- quand j'avais examine les choses en details, sous Unix il y avait des systemes ou la version cxxx ne donnait pas les symboles supplementaires demandes par Posix (comme M_PI) mais la version xxx.h les donnait toujours.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 18-03-2010 à 16:18:23    

Citation :

M_PI est standardise par Posix mais pas par  C ni C++.


 
Ca voudrait que sur une bécane windows, mon code risque de ne plus compiler ?

Reply

Marsh Posté le 18-03-2010 à 16:23:04    

Risque.  Je n'ai jamais developpe sous Windows (sous Dos oui, mais ca fait longtemps)  Il fut un temps ou MS definissait par compatibilite pas mal de chose d'Unix hors standard C, mais ils m'ont l'air d'avoir renomme ces choses avec un _ en tete.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 18-03-2010 à 16:23:04   

Reply

Marsh Posté le 18-03-2010 à 16:49:28    

Un Programmeur a écrit :

Risque.  Je n'ai jamais developpe sous Windows (sous Dos oui, mais ca fait longtemps)  Il fut un temps ou MS definissait par compatibilite pas mal de chose d'Unix hors standard C, mais ils m'ont l'air d'avoir renomme ces choses avec un _ en tete.


 
sous VS2008 en tout cas, M_PI est bien défini dans math.h, et, par extension, cmath
 

s@s /cygdrive/c/Program Files/Microsoft Visual Studio 9.0/VC/include
$ find . -exec grep -Hn M_PI {} \;
./math.h:611: * M_PI       - pi
./math.h:612: * M_PI_2     - pi/2
./math.h:613: * M_PI_4     - pi/4
./math.h:626:#define M_PI       3.14159265358979323846
./math.h:627:#define M_PI_2     1.57079632679489661923
./math.h:628:#define M_PI_4     0.785398163397448309616
./smmintrin.h:177:#define _MM_PICK_OUT_PS(src, num) \


---------------
last.fm
Reply

Marsh Posté le 18-03-2010 à 16:53:21    

theshockwave a écrit :

En tout cas, effectivement, au pire des cas, tu le redéfinis, c'est pas la mer à boire et il y a peu de chance que la valeur vienne à changer un jour ...

Voilà quoi :sweat:
Utiliser des valeurs standard c'est utile quand elles peuvent varier, mais lorsqu'il s'agit d'une valeur qui est la même en tout point du globe...

Reply

Marsh Posté le 18-03-2010 à 18:51:51    

Un jour Pi sera égal à 3.0 et vous ferez moins les malins.

Reply

Marsh Posté le 18-03-2010 à 22:03:24    

En même temps ce jour là on aura de plus gros problèmes à régler que celui de la portabilité du code, à commencer par la circonférence de la lunette des chiottes, parce que si ça fait plus que 3, ben on passera au travers.

Reply

Marsh Posté le 18-03-2010 à 22:43:04    

Puisque t'en parles, je dev un soft de design de lunettes de chiottes.

Reply

Marsh Posté le 18-03-2010 à 22:58:51    

Tu pourrait pas les faire carré tes lunettes ?
De toute manière tout le monde fait pipi à côté.

Reply

Marsh Posté le 21-03-2010 à 21:50:27    

olivthill a écrit :

dans math.h, on a aussi M_PI qui est défini par

#define M_PI  3.14159265358979323846


 
.../...


 
 
Bonjour, je viens juste comparer M_Pi avec mon Pi Ada :
 
Pi : constant :=
          3.14159_26535_89793_23846_26433_83279_50288_41971_69399_37511;

Message cité 1 fois
Message édité par Profil supprimé le 21-03-2010 à 21:50:44
Reply

Marsh Posté le 22-03-2010 à 00:05:36    

#define M_PI  3.14159265358979323846 ... un sujet ?  [ :heink: ]X9
 
voir RFC31415926 @NASA  :heink:


Message édité par __tomjost le 22-03-2010 à 00:08:35
Reply

Marsh Posté le 22-03-2010 à 10:23:26    

Ouais enfin essaie de faire rentrer ça dans un float et après on en reparle.

Reply

Marsh Posté le 22-03-2010 à 15:12:56    

GrosBocdel a écrit :

Je vais me faire défoncer mais : 4*atan(1)


Sans doute car atan est définie dans math.h je suppose...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-03-2010 à 15:49:01    

et calculer une constante comme pi au runtime, belle perf [:pingouino]

Reply

Marsh Posté le 22-03-2010 à 16:10:30    

Joel F a écrit :

et calculer une constante comme pi au runtime, belle perf [:pingouino]


 
On est parfois surpris... gcc calcule le resultat a la compilation.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 22-03-2010 à 16:48:33    

Joel F a écrit :

et calculer une constante comme pi au runtime, belle perf [:pingouino]


 
C'est ce qui est fait dans les premières lignes de beaucoup de programmes de calcul en fortran. Mais après il y a 10 minutes de calcul, donc le calcul de pi c'est un epsilon.


Message édité par GrosBocdel le 22-03-2010 à 16:48:51
Reply

Marsh Posté le 22-03-2010 à 17:18:54    

Ouais, c'est pareil en latin, avant de lire une phrase t'es toujours obligé de re-compiler les déclinaisons, mais bon c'est une langue morte  ;)

Reply

Marsh Posté le 22-03-2010 à 17:29:24    

En même temps j'ai déjà vu des gens stocker les caractères ASCII et leurs codes correspondants, dans une application très connue et très utilisée des milieux qui l'utilisent. Quand je leur ai montré qu'il suffisait de caster ça pour passer de l'un à l'autre, ils sont resté sur le cul.
 
Du coup, au lieu de stocker ça en dur, ben ils ont appris à générer dynamiquement la table avec une boucle for de 0 à 256, en castant en byte pour les codes, et en char pour les lettres.
 
Quelle bande de cons.

Reply

Marsh Posté le 22-03-2010 à 18:08:47    

Un Programmeur a écrit :


On est parfois surpris... gcc calcule le resultat a la compilation.


Ca doit etre un pattern de peephole alors :€

Reply

Marsh Posté le 22-03-2010 à 18:15:01    

Release notes de GCC 4.3

Citation :

The GCC middle-end has been integrated with the MPFR library. This allows GCC to evaluate and replace at compile-time calls to built-in math functions having constant arguments with their mathematically equivalent results. In making use of MPFR, GCC can generate correct results regardless of the math library implementation or floating point precision of the host platform. This also allows GCC to generate identical results regardless of whether one compiles in native or cross-compile configurations to a particular target. The following built-in functions take advantage of this new capability: acos, acosh, asin, asinh, atan2, atan, atanh, cbrt, cos, cosh, drem, erf, erfc, exp10, exp2, exp, expm1, fdim, fma, fmax, fmin, gamma_r, hypot, j0, j1, jn, lgamma_r, log10, log1p, log2, log, pow10, pow, remainder, remquo, sin, sincos, sinh, tan, tanh, tgamma, y0, y1 and yn. The float and long double variants of these functions (e.g. sinf and sinl) are also handled. The sqrt and cabs functions with constant arguments were already optimized in prior GCC releases. Now they also use MPFR.

 

C'est fait assez tot: meme sans optimisation.


Message édité par Un Programmeur le 22-03-2010 à 18:17:16

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 22-03-2010 à 21:39:43    

ouais ok, ca reste un espece de peephole. je note dans un coin ça.

Reply

Marsh Posté le 23-03-2010 à 09:10:49    

Joel F a écrit :

ouais ok, ca reste un espece de peephole. je note dans un coin ça.


 
C'est de l'evaluation d'expression constante -- c'est fait des le front-end (c'est obligatoire en C et en C++ pour les
expressions entieres constantes servant de taille de tableau, une fois la mecanique en place l'utiliser dans les
autres contextes est simple -- ne pas le faire serait peut-etre plus complique) et repetitivement entre les phases
d'optimisation parce que ca permet des autres optimisations et qu'apres certaines optimisations de nouvelles
expressions sont connues contantes.
 
Peephole c'est la toute derniere passe sur le code genere pour tenir compte des particularites de la machine (remplacer
l'instruction d'addition par une constante par celle d'addition d'une constante courte, remplacer une paire d'instructions
simples par une instruction equivalente, ...).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 23-03-2010 à 11:29:28    

oh, ils font ça pendant la propag des constantes. OK je note :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed