Maison >développement back-end >C++ >L'égalité en virgule flottante est-elle toujours fiable ?

L'égalité en virgule flottante est-elle toujours fiable ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-19 21:17:02314parcourir

Is Floating-Point Equality Ever Reliable?

Le cas déroutant de l'égalité en virgule flottante

Dans le domaine du développement logiciel, le sujet de la comparaison en virgule flottante a suscité d'innombrables débats . Bien qu'il soit largement connu que la précision en virgule flottante présente des défis pour déterminer l'égalité, il reste des scénarios dans lesquels l'utilisation de == pourrait ne pas être aussi problématique qu'on pourrait le supposer.

Disséquons l'exemple de code spécifique évoqué :

// Defined in somewhere.h
static const double BAR = 3.14;

// Code elsewhere.cpp
void foo(double d)
{
    if (d == BAR)
        ...
}

La question se pose de savoir s’il existe des situations où cette comparaison serait valable. La réponse réside dans la nature fondamentale de la représentation des données en virgule flottante.

IEEE 754, la norme en vigueur pour les opérations en virgule flottante, garantit que les représentations entières dans une plage spécifique sont exactes lorsqu'elles sont stockées sous forme de flottants. En d'autres termes, les nombres entiers, y compris 0,0, peuvent être directement comparés en utilisant == sans crainte d'erreurs de précision.

Par conséquent, dans le code donné, tant que BAR est initialisé avec une valeur entière comprise dans la plage du float , la comparaison d == BAR est sûre et fiable.

Cependant, lorsqu'il s'agit de variables qui ont subi des opérations ou des calculs mathématiques, la situation devient plus complexe. Bien que certains calculs puissent donner des valeurs entières exactes, d'autres peuvent introduire des erreurs d'arrondi qui invalident l'égalité flottante.

De même, l'appel foo(BAR) comparera toujours égal, en supposant que BAR est bien une constante entière. En effet, les deux variables utilisent la même constante statique, qui représente à coup sûr la même valeur entière sous-jacente.

En conclusion, même si l'égalité à virgule flottante doit généralement être traitée avec prudence, il existe des scénarios spécifiques dans lesquels elle peut être utilisé en toute confiance. Lorsqu'ils comparent des nombres entiers dans la plage du flottant ou utilisent des constantes statiques, les programmeurs peuvent s'appuyer sur la nature précise de la représentation à virgule flottante pour effectuer des contrôles d'égalité fiables.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn