Maison > développement back-end > C++ > Pourquoi les comparaisons de points flottants en C # donnent-elles parfois des résultats inattendus?

Pourquoi les comparaisons de points flottants en C # donnent-elles parfois des résultats inattendus?

Mary-Kate Olsen
Libérer: 2025-01-31 04:07:36
original
560 Les gens l'ont consulté

Why Do Floating Point Comparisons in C# Sometimes Yield Unexpected Results?

c # Dans de nombreux langages de programmation tels que C #, le nombre de points flottants est utilisé pour représenter décimal. Cependant, en raison de la représentation limitée du nombre de points flottants dans l'ordinateur, ces chiffres ont des problèmes de précision.

Considérez les procédures suivantes:

Ce programme sortira faux, ce qui semble contradictoire avec 0,09
class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f * 100f;
        float f2 = 0.09f * 99.999999f;

        Console.WriteLine(f1 > f2);
    }
}
Copier après la connexion
100 supérieur à 0,09

99,999999. Comprendre le problème de la précision

La raison de cette précision est la façon dont le numéro de point flottant est exprimé en mémoire. Ce stockage numérique est une combinaison du numéro de queue (partie décimale), de l'index (puissance de la base) et des symboles. Cependant, la précision du numéro de queue est limitée.

En C #, le numéro de point flottant à provision unique (Float) a 23 chiffres, et le numéro de point flottant à double précision (double) a un numéro de queue à 52 bits. Lorsque le numéro de fin ne peut pas être exprimé avec précision, il entre dans les quatre maisons et cinq au plus proche pour représenter les nombres.

Dans l'exemple ci-dessus, la précision du 0,09

100 est 9.000000190734863, mais parce que la précision est limitée, il est représenté par un flotteur à 32 bits à 9,0. De même, 0,09 99.999999 Quatre maisons et cinq en-cinq sont 9,0. En conséquence, ces deux valeurs sont relativement égales et le programme sort faux.

Afin de réduire cette précision, la norme de fonctionnement flottante IEEE 754 introduit le concept d'Epsilon, ce qui signifie qu'il peut être ajouté à 1.0 sans modifier son point de fonctionnement avant minimum. En C #, cette valeur est d'environ 1,4013e-45. En comparant la différence entre les deux nombres de points flottants avec l'Epsilon, il peut être déterminé s'ils sont valides pour leur validité dans la plage de précision du point flottant.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal