je suis debutant en c et je voudrais savoir comment augmenter la precision sur les chiffres, à savoir augmenter le nombre de decimales des chiffres
suffit il de passer de float à double , voire a long double ?
qui peut m expliquer le probleme ?merci
Version imprimable
je suis debutant en c et je voudrais savoir comment augmenter la precision sur les chiffres, à savoir augmenter le nombre de decimales des chiffres
suffit il de passer de float à double , voire a long double ?
qui peut m expliquer le probleme ?merci
Salut, fais tes calculs en double et non pas en float. Je crois que long double est la même chose que double (mais je n'en suis pas trop trop sûr).
De toute manière, en double tu peux aller jusqu'à DBL_EPSILON (#include <float.h>) alors qu'en float tu vas jusqu'en FLT_EPSILON
Ben non, evidemment (sinon ce n'est pas necessaire de l'inventer):Citation:
Envoyé par salseropom
Citation:
Envoyé par C ISO 99
Plus precisement, FLT_EPSILON est la plus petite valeur telle que x + FLT_EPSILON est different de x.Citation:
De toute manière, en double tu peux aller jusqu'à DBL_EPSILON (#include <float.h>) alors qu'en float tu vas jusqu'en FLT_EPSILON
En general, le probleme du 'nombre de chiffres' apres la virgule se pose lorsqu'on affiche une valeur. Il faut jouer sur les formatteurs de *printf() pour changer ce nombre.
Code:
1
2
3
4 float value = 98.723; printf("%.0f\n", value); /* pas de chiffre apres la virgule */ printf("%.3f\n", value); /* trois chiffres apres la virgule */
merci pour les infos
par contre j arrive pas a trouver comment afficher un long double
car printf("%.5lf",x) ou printf("%0.5f",x) ne marchent pas si x est un long double
%Lf ou %LF apparemment : man printf ;)Citation:
Envoyé par informatik
il semblerait qu il y ait une chose affreuse
quand j utilise un double, en fait il n est codé que sur 17 chiffres significatifs en tout et pour tout donc plus il y a de chiffres avant la virgule, moins il y en a apres la virgule; c est ce que m indique un petit programme que j ai fait
c est pas tres pratique pour le calcul numerique tout ça non ?
Je crois que Windows utilise la même représentation pour les deux types. C'est domage sur x86 car c'est un des rares (même s'il est répandu) processeur à avoir un support hard pour quelque chose de plus précis que les doubles (un flottant sur 80 bits). Linux utilise ce type. Sur ma sun au boulot, long double fait 128 bits.Citation:
Envoyé par DaZumba
Oui, j'ai ete imprecis. Je voulais dire que selon la norme, long double et double sont deux types differents, avec la garantie que l'ensemble des long double soit superieur ou egal a l'ensemble des double. Il semble que certaines implementations aient choisit le 'egal' !Citation:
Envoyé par Jean-Marc.Bourguet
Tu viens de découvrir le principe des représentations en virgule flottantes.Citation:
Envoyé par informatik
Si on a un nombre restreint de bits à consacrer à la représentation, tu n'as guère de choix. Soit tu travailles en précision absoulue constante sur un intervalle donné (c'est les représentations en virgule fixe, il n'y a pas de support dans le langage C pour ça mais il en a un dans d'autres langages -- par exemple Ada; la technique c'est d'utiliser des entiers et puis d'appliquer des facteurs correctifs quand on fait des multiplications et des divisions), soit on utilise une précision relative plus ou moins constante sur un intervalle plus grand, ce sont les flottants. Quand on manipule des nombres qui ont une signification physiques, les flottants sont souvent un meilleur compromis. Si tu fais de la finance, les flottants sont à éviter.Citation:
c est pas tres pratique pour le calcul numerique tout ça non ?
Bonjour,
Ce n'est pas Windows, ce sont certains compilateurs, et je ne doute pas que ce soit le cas également avec Linux.Citation:
Envoyé par Jean-Marc.Bourguet
La norme est claire : c'est au choix de l'implémentation.
Pour Windows :
- Visual C++ de Microsoft utilise la même taille (8 octets) pour les double et les long double.
- Pour GCC, sizeof(double) = 8. sizeof(log double) = 12, avec un piège dans ce cas : la taille effectivement utilisée = 10, les 2 octets de poids fort étant toujours à 0, et les 10 autres étant de fait au format flottant 10 octets de la FPU des processeurs Intel (peut-être d'autres procs aussi, vu que cette représentation est normalisée, je ne sais pas).
Non,Citation:
Envoyé par DaZumba
FLT_EPSILON est la plus petite valeur telle que 1.0f + FLT_EPSILON est different de 1.0f.
Il faut toujours adapter le epsilon aux nombres comparées, en l'agrandissant ou le diminuant.