Maison > développement back-end > C++ > Comment comparer de manière fiable les nombres à virgule flottante en C# ?

Comment comparer de manière fiable les nombres à virgule flottante en C# ?

Linda Hamilton
Libérer: 2025-01-23 10:56:10
original
742 Les gens l'ont consulté

How to Reliably Compare Floating-Point Numbers in C#?

Fonction de comparaison à virgule flottante C#

En C#, la comparaison de nombres à virgule flottante peut présenter des défis en raison de leurs limites de précision inhérentes. Pour résoudre ce problème, envisagez d'implémenter une fonction de comparaison personnalisée.

Fonction IsEqual

Écrire une fonction IsEqual générique pour les valeurs à virgule flottante peut être difficile. Une approche courante consiste à utiliser un seuil de tolérance, ou epsilon. Par exemple :

<code class="language-csharp">public static bool NearlyEqual(double a, double b, double epsilon)
{
    const double MinNormal = 2.2250738585072014E-308d;
    double absA = Math.Abs(a);
    double absB = Math.Abs(b);
    double diff = Math.Abs(a - b);

    // 处理特殊情况(例如,无穷大)
    if (a.Equals(b))
        return true;

    // 考虑 a 或 b 接近零的情况
    if (a == 0 || b == 0 || absA + absB < MinNormal)
        return diff < epsilon;

    // 使用相对误差
    return diff / (absA + absB) < epsilon;
}</code>
Copier après la connexion

Fonctions IsGreater et IsLess

La méthode d'implémentation des fonctions IsGreater et IsLess est similaire :

<code class="language-csharp">public static bool IsGreater(double a, double b, double epsilon)
{
    // 处理特殊情况
    if (a.CompareTo(b) > 0)
        return true;
    if (a.CompareTo(b) == 0)
        return false;

    // 对非零情况使用相对误差
    double diff = a - b;
    double absA = Math.Abs(a);
    double absB = Math.Abs(b);
    return diff / (absA + absB) > epsilon;
}

public static bool IsLess(double a, double b, double epsilon)
{
    // IsGreater 的反向操作
    return IsGreater(b, a, epsilon);
}</code>
Copier après la connexion

Ces fonctions fournissent un moyen utile de comparer des valeurs à virgule flottante en C# tout en tenant compte de leurs limitations de précision inhérentes.

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!

source:php.cn
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