Attention aux nombres flottants

Attention aux nombres flottants - Divers - Programmation

Marsh Posté le 29-03-2011 à 12:06:59    

Juste pour rappeler ici une règle de programmation :
on ne fait jamais de test d'égalité if(a==b) sur un nombre flottant. (donc, les float, doubles, etc)
 
On ne peut le faire que si :
- ils sont arrondis avant (donc dans excel, on peut le faire, puisqu'il arrondi avant les tests). Idem, les BDD arrondissent pour prendre moins de place.
- ils sont représentés en binaire sous la forme de nombres entiers (3,14 = 314*10^-2). C'est moins performant, mais cela n'est pas touché par le problème.
 
Et ca touche tous les langages, parce que ca touche la représentation binaire d'un décimal sur une taille nécessairement finie. (en binaire 0,1=0,0001100110011... 0011 répété à l'infini), et cette représentation est nécessairement faite dans le cpu (si on lui demande de manipuler des flottants)
 
Donc, en résumé :
pas de tests d'égalité de quelque façon que ce soit entre 2 flottants. (de toute façon, cela n'a pas grand sens)
(et accessoirement, arrondi obligatoire avant tout affichage d'un nombre flottant pour l'utilisateur)
 
(j'espère avoir appris un truc à des gens)

Reply

Marsh Posté le 29-03-2011 à 12:06:59   

Reply

Marsh Posté le 30-03-2011 à 11:52:25    

Bien, mais ça aurait été encore mieux de donner une solution pour comparer des flottants non ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-03-2011 à 23:11:52    

ça ce trouve assez facilement:

Code :
  1. bool AreSame(double a, double b)
  2. {
  3.    return fabs(a - b) < EPSILON;
  4. }
 

Ou sinon une bonne lecture sur le sujet: http://www.cygnus-software.com/pap [...] floats.htm


Message édité par h3bus le 30-03-2011 à 23:15:10

---------------
sheep++
Reply

Marsh Posté le 31-03-2011 à 09:33:53    

IMO, Harkonnen le savait !

Reply

Marsh Posté le 01-04-2011 à 13:53:35    

ou faire un round en gardant x décimales pour chacun des 2 nbs ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 01-04-2011 à 16:22:42    

On peut faire des choses amusantes avec les floats... Par exemple:
 

Code :
  1. while (x == (x+1))
  2. {
  3.     // ici on est dans une boucle infinie ;)
  4.     // il suffit d'avoir la bonne valeur de x
  5. }


 
Si si, parfois avec les float, x est égal à x+1 (je vous laisse chercher la valeur de x mais c'est pas compliqué).
 
Un autre "problème" très connu, c'est la perte de l'associativité des opérations arithmétiques... Parfois, avec les floats on aura que:

Code :
  1. (a + b) + c != a + (b + c)


 
Pour les débutants dans le domaine c'est amusant de trouver pour quelles valeurs de a, b, c on aura cette inégalité. Les programmeurs expérimentés (c'est-à-dire ayant au moins écrit une fois une applic sérieuse utilisant des floats) savent déjà ces choses.


Message édité par leonhard le 01-04-2011 à 16:23:20
Reply

Sujets relatifs:

Leave a Replay

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