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

  FORUM HardWare.fr
  Programmation
  C

  Flottants en C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Flottants en C

n°1994303
Lachouette​4
Posté le 18-05-2010 à 23:50:04  profilanswer
 

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 ?

mood
Publicité
Posté le 18-05-2010 à 23:50:04  profilanswer
 

n°1994308
TotalRecal​l
Posté le 19-05-2010 à 00:44:58  profilanswer
 

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
n°1994318
Joel F
Real men use unique_ptr
Posté le 19-05-2010 à 06:50:33  profilanswer
 
n°1994392
SquiZZ
Posté le 19-05-2010 à 11:50:23  profilanswer
 

J'étais tombé sur ce site http://floating-point-gui.de/ il y a quelques temps, c'est peut être un peu moins brutal.

n°1994553
Sve@r
Posté le 19-05-2010 à 19:32:29  profilanswer
 

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.
n°1994568
Un Program​meur
Posté le 19-05-2010 à 20:48:07  profilanswer
 

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)
n°1994571
TotalRecal​l
Posté le 19-05-2010 à 20:55:57  profilanswer
 

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
n°1994576
Joel F
Real men use unique_ptr
Posté le 19-05-2010 à 21:23:05  profilanswer
 

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

n°1994626
Lachouette​4
Posté le 19-05-2010 à 23:22:28  profilanswer
 

Merci pour toutes ces "précisions". Je vais potasser le sujet, et en attendant, utiliser des doubles.


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

  Flottants en C

 

Sujets relatifs
aide pour socket TCP IP en CComment dessiner arbre de recherche binaire en graphisme sous C ou C++
grands nombres en CPgsql/C: truncate table après un timer???
Débutant need Help en CLink error et Objective-C
Traduire une fonction aléatoire de l'algorithme en langage C ?!Code C++ Pour tester un mémoire DDR2
Langage C : passage d'un tableau à une fonctionRafraichir un GROUPBOX (C++, Win32)
Plus de sujets relatifs à : Flottants en C


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