Flottants en C

Flottants en C - C - Programmation

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 ?

Reply

Marsh Posté le 18-05-2010 à 23:50:04   

Reply

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.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 19-05-2010 à 06:50:33    

Reply

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.

Reply

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


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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 :
  1. $ python
  2. Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
  3. [GCC 4.4.3] on linux2
  4. Type "help", "copyright", "credits" or "license" for more information.
  5. >>> from decimal import *
  6. >>> getcontext().prec = 2
  7. >>> x=Decimal("0.99" )
  8. >>> y=Decimal("0.98" )
  9. >>> (x+y)/2
  10. Decimal('1.0')


 

Citation :

Dommage que cette librairie n'existât pas en C...


 
http://gcc.gnu.org/onlinedocs/gcc/Decimal-Float.html


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

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é :whistle:


Message édité par TotalRecall le 19-05-2010 à 20:58:37

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 19-05-2010 à 21:23:05    

long double n'a pas de taille standard, c'est le pb :/

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

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