Flottants en C - C - Programmation
Marsh Posté le 19-05-2010 à 00:44:58
C'est une question récurrente...
Ce genre d'erreurs est liée à la façon approximative dont les flottants sont représentés en mémoire (cf norme IEEE 754).
Utilise un double si tu peux pour avoir quelque chose de plus précis.
Marsh Posté le 19-05-2010 à 06:50:33
http://docs.sun.com/source/806-3568/ncg_goldberg.html
que tout le monde devrait lire
Marsh Posté le 19-05-2010 à 11:50:23
J'étais tombé sur ce site http://floating-point-gui.de/ il y a quelques temps, c'est peut être un peu moins brutal.
Marsh Posté le 19-05-2010 à 19:32:29
Python possède la librairie "decimal" permettant un calcul 100% fiable. Cette librairie stocke les nombres sous forme de tableaux (une case par digit) et ensuite, effectue les opérations selon la méthode utilisée au primaire. Dommage que cette librairie n'existât pas en C...
Marsh Posté le 19-05-2010 à 20:48:07
Sve@r a écrit : Python possède la librairie "decimal" permettant un calcul 100% fiable. |
Non. Il y a des limitations dès que tu utilises une représentation de taille bornée, et encore plus si tu utilises une représentation de taille constante ce que Decimal fait.
Les flottants décimaux permettent une représentation exacte des nombres décimaux, mais tous les problèmes des flottants qui ne sont pas liés à ce point précis sont toujours présents, et quelques uns en plus. Exemple de ceux-ci (a+b)/2 peut être strictement plus grand que a et b, ce qui n'est pas possible avec des flottants binaires. Comme toujours, c'est plus facile de comprendre si on limite un peu la précision:
Code :
|
Citation : Dommage que cette librairie n'existât pas en C... |
http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html
Marsh Posté le 19-05-2010 à 20:55:57
De mémoire le C supporte le type long double depuis très longtemps, qui est codé sur 80 bits. Ca reste un type approximatif mais ça permet déjà de voir assez loin.
Il me semble qu'en C il y existe des équivalents au decimal, en passant par je ne sais plus trop quoi.
Si le decimal de python fonctionne comme celui de .Net (128 bits, grosse mantisse, petit exposant), il s'agit d'un type tout de même approximatif mais avec une mantisse tellement énorme qu'il faut un nombre important de décimales avant de voir des pertes. Par contre l'étendue est plus limitée du fait de l'exposant réduit.
Pour aller au delà il faut passer par des libs spécialisées, mais bonjour les perfs, c'est pas pour rien qu'en 3D/embarqué/temps réel on travaille en float... Dans la majorité des applications les types natifs couvrent tous les besoins.
edit : grillé par Un Programmeur, ça m'apprendra à commencer à taper un truc et faire autre chose à côté
Marsh Posté le 19-05-2010 à 23:22:28
Merci pour toutes ces "précisions". Je vais potasser le sujet, et en attendant, utiliser des doubles.
Marsh Posté le 18-05-2010 à 23:50:04
Bonjour,
Je suis débutant en programmation C, et je bute sur un problème avec les flottants de grande dimension.
float i;
i = 1000000001.0;
printf ("i = %f\n", i);
le résultat affiché est 1000000000.0 et non pas 1000000001.0 !!
Quel et ce mystère ?