Maison > développement back-end > Golang > Go Float Equality : comparaison au niveau des bits et basée sur Epsilon – Quel est le meilleur ?

Go Float Equality : comparaison au niveau des bits et basée sur Epsilon – Quel est le meilleur ?

Linda Hamilton
Libérer: 2024-12-11 20:36:11
original
614 Les gens l'ont consulté

Go Float Equality: Bitwise vs. Epsilon-Based Comparison – Which is Better?

Comparaison Go Float : égalité au niveau du bit et égalité basée sur Epsilon

Question :

Dans le domaine des Go arithmétique à virgule flottante, quelle approche offre une précision et une efficacité supérieures pour déterminer l'égalité entre deux flottants (float64) avec une valeur approximative tolérance ?

Approche 1 : Comparaison au niveau des bits

Cette approche exploite la représentation mathématique des nombres à virgule flottante IEEE 754 pour vérifier l'égalité au niveau des bits :

func Equal(a, b float64) bool {
    ba := math.Float64bits(a)
    bb := math.Float64bits(b)
    diff := ba - bb
    if diff < 0 {
        diff = -diff
    }
    return diff < 2
}
Copier après la connexion

Approche 2 : Différence absolue avec Epsilon

L'approche traditionnelle consiste à soustraire les deux flottants et à comparer la valeur absolue avec une tolérance arbitraire (epsilon, généralement 1e-9) :

func almostEqual(a, b float64) bool {
    return math.Abs(a - b) <= float64EqualityThreshold
}
Copier après la connexion

Analyse :

Malgré son attrait pour l'efficacité matérielle, l'approche de comparaison au niveau des bits peut conduire à des résultats incorrects dans certains scénarios.

Par exemple, comparer deux flotteurs dénormalisés (flotteurs avec des exposants inférieurs à la normale) peut indiquer par erreur une égalité malgré une différence non nulle en raison de la présence de zéros implicites non significatifs. De plus, cette approche devient moins fiable à mesure que l'ampleur des flotteurs augmente.

En revanche, l'approche basée sur epsilon gère correctement les flotteurs dénormalisés. En considérant uniquement la différence absolue, il élimine le risque de faux positifs au niveau des bits et fournit des contrôles d'égalité cohérents sur une large plage de valeurs flottantes.

Conclusion :

Bien que la comparaison au niveau des bits puisse sembler une approche intuitive de l'égalité flottante, l'approche basée sur epsilon s'avère plus générique, précise et efficace pour les applications générales. Il garantit des tests d'égalité précis sans les pièges des représentations au niveau du bit.

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