Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2957 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  PI

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PI

n°1974860
snafu8
Posté le 18-03-2010 à 12:01:20  profilanswer
 

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.

mood
Publicité
Posté le 18-03-2010 à 12:01:20  profilanswer
 

n°1974871
olivthill
Posté le 18-03-2010 à 12:56:08  profilanswer
 

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
n°1974927
snafu8
Posté le 18-03-2010 à 15:06:17  profilanswer
 

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

n°1974939
theshockwa​ve
I work at a firm named Koslow
Posté le 18-03-2010 à 15:34:08  profilanswer
 

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
n°1974941
snafu8
Posté le 18-03-2010 à 15:39:53  profilanswer
 

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.

n°1974944
GrosBocdel
Posté le 18-03-2010 à 15:41:55  profilanswer
 

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

n°1974946
theshockwa​ve
I work at a firm named Koslow
Posté le 18-03-2010 à 15:50:06  profilanswer
 

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
n°1974949
Un Program​meur
Posté le 18-03-2010 à 15:58:26  profilanswer
 

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)
n°1974958
snafu8
Posté le 18-03-2010 à 16:18:23  profilanswer
 

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 ?

n°1974959
Un Program​meur
Posté le 18-03-2010 à 16:23:04  profilanswer
 

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)
mood
Publicité
Posté le 18-03-2010 à 16:23:04  profilanswer
 

n°1974967
theshockwa​ve
I work at a firm named Koslow
Posté le 18-03-2010 à 16:49:28  profilanswer
 

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
n°1974970
Kenelm
Posté le 18-03-2010 à 16:53:21  profilanswer
 

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...

n°1975011
snafu8
Posté le 18-03-2010 à 18:51:51  profilanswer
 

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

n°1975047
Kenelm
Posté le 18-03-2010 à 22:03:24  profilanswer
 

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.

n°1975058
snafu8
Posté le 18-03-2010 à 22:43:04  profilanswer
 

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

n°1975060
Profil sup​primé
Posté le 18-03-2010 à 22:58:51  answer
 

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

n°1975804
Profil sup​primé
Posté le 21-03-2010 à 21:50:27  answer
 

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
n°1975832
__tomjost
c'est un pseudo !
Posté le 22-03-2010 à 00:05:36  profilanswer
 

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


Message édité par __tomjost le 22-03-2010 à 00:08:35
n°1975873
Kenelm
Posté le 22-03-2010 à 10:23:26  profilanswer
 

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

n°1975990
jagstang
Pa Capona ಠ_ಠ
Posté le 22-03-2010 à 15:12:56  profilanswer
 

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?  
n°1975999
Joel F
Real men use unique_ptr
Posté le 22-03-2010 à 15:49:01  profilanswer
 

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

n°1976014
Un Program​meur
Posté le 22-03-2010 à 16:10:30  profilanswer
 

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)
n°1976041
GrosBocdel
Posté le 22-03-2010 à 16:48:33  profilanswer
 

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
n°1976061
snafu8
Posté le 22-03-2010 à 17:18:54  profilanswer
 

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  ;)

n°1976067
Kenelm
Posté le 22-03-2010 à 17:29:24  profilanswer
 

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.

n°1976085
Joel F
Real men use unique_ptr
Posté le 22-03-2010 à 18:08:47  profilanswer
 

Un Programmeur a écrit :


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


Ca doit etre un pattern de peephole alors :€

n°1976088
Un Program​meur
Posté le 22-03-2010 à 18:15:01  profilanswer
 

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)
n°1976131
Joel F
Real men use unique_ptr
Posté le 22-03-2010 à 21:39:43  profilanswer
 

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

n°1976178
Un Program​meur
Posté le 23-03-2010 à 09:10:49  profilanswer
 

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)
n°1976250
Joel F
Real men use unique_ptr
Posté le 23-03-2010 à 11:29:28  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  PI

 

Sujets relatifs
Plus de sujets relatifs à : PI


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR