Maison > Article > développement back-end > Pourquoi « float == double » ne fonctionne-t-il pas toujours ?
Comparaison des doubles et des flottants : pourquoi des résultats inattendus ?
Les nombres à virgule flottante comme les doubles et les flottants jouent un rôle crucial dans le calcul numérique. Cependant, comparer ces types peut conduire à des résultats déroutants, comme l'illustre l'extrait de code ci-dessous :
<code class="python">float f = 1.1 double d = 1.1 if (f == d): # returns false!</code>
Ce comportement inattendu provient de deux facteurs fondamentaux : la précision et l'arrondi.
Précision :
Les nombres à virgule flottante ont une précision finie, ce qui limite le nombre de chiffres qu'ils peuvent représenter avec précision. Les nombres avec une plus grande précision nécessitent plus de mémoire, ce qui n'est pas toujours réalisable pour les variables à virgule flottante.
Par exemple, la fraction 1/3 en décimal (0,33333...) ne peut pas être représentée avec précision dans un format 32 bits. flotter. Il doit être approximé et stocké sous la forme 0,3333333333333333, ce qui entraîne une infime perte de précision.
Arrondi :
Les nombres binaires et décimaux ont des différences inhérentes. Les fractions qui peuvent être facilement représentées en décimal (par exemple, 1/10 par 0,1) nécessitent souvent des représentations complexes en binaire (par exemple, 1/10 par 0,0001100110011...).
Cet écart entraîne des erreurs d'arrondi, où les valeurs à virgule flottante sont tronquées pour respecter les limitations de mémoire. Par conséquent, la représentation de 0,1 dans l'exemple de code peut ne pas être exactement égale à 0,1 stockée dans le double.
Conclusion :
En raison de problèmes de précision et d'arrondi , comparer les doubles et les flottants en utilisant l'égalité (==) n'est pas fiable. Au lieu de cela, une approche plus robuste consiste à comparer leur différence absolue à une valeur epsilon acceptable. Cela garantit que la différence se situe dans une tolérance acceptable.
<code class="python">if abs(f - d) < epsilon: # epsilon is a small threshold</code>
Cette approche garantit que la comparaison n'est pas affectée par des erreurs de précision et d'arrondi, conduisant à des résultats précis et cohérents.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!