PI - C++ - Programmation
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() |
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
|
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
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.
Marsh Posté le 18-03-2010 à 15:41:55
ReplyMarsh 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 ...
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.
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 ?
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.
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 |
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
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...
Marsh Posté le 18-03-2010 à 18:51:51
Un jour Pi sera égal à 3.0 et vous ferez moins les malins.
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.
Marsh Posté le 18-03-2010 à 22:43:04
Puisque t'en parles, je dev un soft de design de lunettes de chiottes.
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é.
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
|
Bonjour, je viens juste comparer M_Pi avec mon Pi Ada :
Pi : constant :=
3.14159_26535_89793_23846_26433_83279_50288_41971_69399_37511;
Marsh Posté le 22-03-2010 à 00:05:36
#define M_PI 3.14159265358979323846 ... un sujet ? [ ]X9
voir RFC31415926 @NASA
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.
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...
Marsh Posté le 22-03-2010 à 15:49:01
ReplyMarsh Posté le 22-03-2010 à 16:10:30
Joel F a écrit : et calculer une constante comme pi au runtime, belle perf |
On est parfois surpris... gcc calcule le resultat a la compilation.
Marsh Posté le 22-03-2010 à 16:48:33
Joel F a écrit : et calculer une constante comme pi au runtime, belle perf |
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.
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
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.
Marsh Posté le 22-03-2010 à 18:08:47
Un Programmeur a écrit : |
Ca doit etre un pattern de peephole alors :€
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.
Marsh Posté le 22-03-2010 à 21:39:43
ReplyMarsh 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, ...).
Marsh Posté le 23-03-2010 à 11:29:28
oh, ils font ça pendant la propag des constantes. OK je note
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.