Attention aux nombres flottants - Divers - Programmation
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 ?
Marsh Posté le 30-03-2011 à 23:11:52
ça ce trouve assez facilement:
Code :
|
Ou sinon une bonne lecture sur le sujet: http://www.cygnus-software.com/pap [...] floats.htm
Marsh Posté le 01-04-2011 à 13:53:35
ou faire un round en gardant x décimales pour chacun des 2 nbs
Marsh Posté le 01-04-2011 à 16:22:42
On peut faire des choses amusantes avec les floats... Par exemple:
Code :
|
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 :
|
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.
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)