Est-il correct de comparer deux nombres à virgule flottante arrondis à l'aide de l'opérateur ==?

StackOverflow https://stackoverflow.com/questions/236439

Question

Ou y a-t-il un risque que l'opération échoue?

Merci.

J'ai choisi le mauvais terme et ce que je voulais vraiment dire était d'arrondir à 0 et non de troncature.

Le problème, c’est que j’ai besoin de comparer la partie entière de deux doubles. Je les ai simplement convertis en int puis en utilisant ==, mais, comme l’a souligné quelqu'un dans l'une de mes questions précédentes, cela pourrait entraîner un débordement. exception si le double ne rentre pas dans l'entier.

La question serait donc: "Est-il correct d'utiliser l'opérateur == pour comparer deux doublons précédemment arrondis à 0, ou devrais-je m'en tenir à la méthode de transtypage en int et attraper une éventuelle exception?

Était-ce utile?

La solution

Voici le site mis à jour qui traite des avantages et inconvénients de plusieurs méthodes de comparaison de nombres en virgule flottante. (Vous pouvez toujours consulter le ancien site ici .)

La méthode que je choisirais est "l’erreur relative". méthode. Trouvez la différence entre les deux nombres, convertissez-le en pourcentage et si ce pourcentage est suffisamment petit, vous obtenez l'égalité.

Autres conseils

Pire encore, parfois, même pour le même nombre, il échouera. En effet, certains compilateurs ou processeurs utilisent plus de bits de précision dans un registre de CPU que dans la mémoire (MSVC propose 3 options de comportement en virgule flottante différentes, par exemple). Ainsi, une valeur récemment calculée peut ne pas avoir ces bits tronqués et semblera être inégale. NE JAMAIS utiliser == sur des flotteurs.

Il peut toujours échouer en raison des problèmes normaux liés à la représentation en virgule flottante. Plutôt que de les tronquer, utilisez un delta qui représenterait la précision équivalente.

Il peut échouer dans les cas où vous avez deux flottants que vous considéreriez normalement identiques,

  
    

10.19999999

         

10.20000001

  

mais lorsque vous les tronquez, ils donnent des résultats différents.

  
    

10.19

         

10.20

  

Alors que si j'avais utilisé un delta de 0,001 pour comparer la différence, j'aurais vu que ces deux valeurs sont effectivement les mêmes.

Il n'est jamais correct d'utiliser == avec une virgule flottante.

Qu'est-ce que " tronque " signifie dans un contexte de virgule flottante? Quelle fonction de bibliothèque spécifique appelez-vous? Quel est le résultat? Qu'est-ce qui vous fait croire que " tronqué " les valeurs sont plus comparables que les valeurs non tronquées?

La virgule flottante est une approximation des valeurs décimales. Le point flottant ne peut représenter que des puissances de deux précisément. Toutes les autres valeurs sont sujettes à des erreurs, quelles que soient vos opérations en virgule flottante.

Si, toutefois, vous convertissez en entier, vous pouvez utiliser == .

Si votre valeur absolue est inférieure à 2 ^ 23 pour un simple ou à 2 ^ 52 pour un double, vous pouvez utiliser round () puis faire la comparaison. Les valeurs plus grandes ne peuvent pas être stockées avec précision, ce qui ouvre la voie aux situations où N == N + 1.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top