Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue79:tutoriel_-_python_49 [2014/03/16 21:18] – [8] fredphil91 | issue79:tutoriel_-_python_49 [2014/03/29 17:57] (Version actuelle) – [8] auntiee |
---|
WHAT?!!?!?** | WHAT?!!?!?** |
| |
Alors que je travaillais cette semaine, une personne très sage du nom de Michael W. m'a suggéré d'examiner ce qui se passe avec des nombres à virgule flottante et l'égalité. | Alors que j'étais au boulot cette semaine, une personne très sage du nom de Michael W. m'a suggéré d'examiner ce qui se passe avec des nombres à virgule flottante et l'égalité. |
| |
Prenez par exemple un simple calcul : 1.1 + 2.2 | Prenez par exemple un simple calcul : 1.1 + 2.2 |
1.1+2.2 | 1.1+2.2 |
| |
Et la réponse est : 3.3000000000000003 Vous regardez fixement l'écran, incrédule, et pensez d'abord « je dois avoir saisi quelque chose de travers ». Ensuite, vous vous rendez compte que non. Et vous tapez : | Et la réponse est : 3.3000000000000003 Vous regardez fixement l'écran, incrédule, et pensez d'abord : « je dois avoir saisi quelque chose de travers ». Ensuite, vous vous rendez compte que non. Et vous tapez : |
| |
2.2+3.3 | 2.2+3.3 |
| |
5.5 Maintenant, vous êtes encore plus confus et vous vous dites « D'accord. Il s'agit soit d'un bug ou d'une sorte d’œuf de Pâques [NdT : blague informatique] ». Non, ce n'est ni un bug ni un œuf de Pâques. C'est réel. Même si je connaissais ce phénomène il y a très longtemps, il avait glissé dans les profondeurs et les recoins les plus sombres de mon vieil esprit, et il a fallu que je le fasse remonter. Ce que nous voyons là est la joie des nombres binaires à virgule flottante. | 5.5 Maintenant, vous êtes encore plus confus et vous vous dites : « D'accord. Il s'agit soit d'un bug soit d'une sorte d’œuf de Pâques [Ndt : blague informatique] ». Non, ce n'est ni un bug ni un œuf de Pâques. C'est réel. Même si je connaissais ce phénomène il y a très longtemps, il avait glissé dans les profondeurs et les recoins les plus sombres de mon vieux cerveau et il a fallu que je le fasse remonter. Ce que nous voyons là est la joie des nombres binaires à virgule flottante. |
| |
====== 3 ====== | ====== 3 ====== |
Decimal(1/10.0) | Decimal(1/10.0) |
| |
Decimal('0.1000000000000000055511151231257827021181583404541015625') WOW. Essayons donc notre formule originale et voons ce que cela affiche : | Decimal('0.1000000000000000055511151231257827021181583404541015625') WOW. Essayons donc notre formule originale et voyons ce que cela affiche : |
| |
Decimal(1.1+2.2) | Decimal(1.1+2.2) |
So what do we do about it? Well, the quick answer is that you probably can live with it for 90% of the things we have to do out there in the real world – by using the round() method. While you have to decide on the number of decimal points that you must have in your world to carry the precision that you need, for the most part, this will be an acceptable workaround.** | So what do we do about it? Well, the quick answer is that you probably can live with it for 90% of the things we have to do out there in the real world – by using the round() method. While you have to decide on the number of decimal points that you must have in your world to carry the precision that you need, for the most part, this will be an acceptable workaround.** |
| |
C'est ce qu'on appelle l'erreur de représentation, elle existe dans presque tous les langages de programmation moderne (Python, C, C++, Java, Fortran et d'autres), et sur presque tous les ordinateurs modernes. C'est parce que ces machines utilisent l'arithmétique en virgule flottante IEEE-754 qui (sur la plupart des machines et des système d'exploitation) correspond à un nombre en double précision IEEE-754. Ce nombre en double précision a une précision de 53 bits. Ainsi, notre 0.1, quand il est représenté en 53-bit double précision, se transforme en : 0.00011001100110011001100110011001100110011001100110011010 C'est proche de 0.1 mais pas assez proche pour éviter les problèmes. | C'est ce qu'on appelle une Erreur de représentation, elle existe dans presque tous les langages de programmation moderne (Python, C, C++, Java, Fortran et d'autres) et sur presque tous les ordinateurs modernes. C'est parce que ces machines utilisent l'arithmétique en virgule flottante IEEE-754 qui (sur la plupart des machines et des systèmes d'exploitation) correspond à un nombre en double précision IEEE-754. Ce nombre en double précision a une précision de 53 bits. Ainsi, notre 0.1, quand il est représenté en 53-bit double précision, se transforme en : 0.00011001100110011001100110011001100110011001100110011010 C'est proche de 0.1 mais pas assez proche pour éviter les problèmes. |
| |
Alors, que faisons-nous avec ça ? Eh bien, la réponse rapide est que vous pouvez probablement vivre avec dans 90% des cas que nous avons à traiter dans le monde réel - en utilisant la méthode round(). Vous devrez décider le nombre de décimales dont vous avez besoin dans votre monde pour avoir la précision dont vous avez besoin, mais pour la plupart ce sera une solution acceptable. | Alors, que faisons-nous avec ça ? Eh bien, la réponse rapide est que vous pouvez probablement vivre avec dans 90% des cas que nous avons à traiter dans le monde réel - en utilisant la méthode round(). Vous devrez décider le nombre de décimales dont vous avez besoin dans votre monde pour avoir la précision dont vous avez besoin, mais la plupart du temps ce sera une solution acceptable. |
| |
====== 6 ====== | ====== 6 ====== |
round(2.675,2) | round(2.675,2) |
| |
2.67 Cela pourrait poser un problème. Et on revient à la question initiale dont nous parlions. Avec la conversion en un nombre binaire à virgule flottante de 53 bits de long, le nombre devient : 2,6749999999999998223653160599749535221893310546875 qui est arrondi à 2.67. | 2.67 Cela pourrait poser un problème. Et on revient à la question initiale dont nous parlions. Avec la conversion en un nombre binaire à virgule flottante de 53 bits de long, le nombre devient : 2,6749999999999998223653160599749535221893310546875 qui est arrondi à 2.67. |
| |
L'essentiel ici est qu'en essayant de comparer les nombres à virgule flottante, il faut être conscient que certaines choses ne se traduisent pas bien. | L'essentiel ici est qu'en essayant de comparer les nombres à virgule flottante, il faut être conscient que certaines choses ne se traduisent pas bien. |