Maison > développement back-end > Golang > Comment puis-je comparer efficacement des nombres à virgule flottante pour une quasi-égalité en Go ?

Comment puis-je comparer efficacement des nombres à virgule flottante pour une quasi-égalité en Go ?

Linda Hamilton
Libérer: 2024-12-07 14:07:15
original
787 Les gens l'ont consulté

How Can I Efficiently Compare Floating-Point Numbers for Near Equality in Go?

Comparaison des flotteurs Go : une approche efficace pour une quasi-égalité

Dans Go, comparer deux flotteurs (float64) pour l'égalité peut être une tâche délicate en raison des limitations de la représentation à virgule flottante IEEE 754. Bien que la méthode conventionnelle "abs(diff) < epsilon" fournisse une approximation, elle peut conduire à des incohérences.

Solution proposée : comparaison de niveaux de bits

Une proposition La solution suggère de comparer la représentation au niveau du bit des valeurs float64. Le raisonnement est qu'une différence d'un bit dans la représentation binaire garantit une quasi-égalité, car toute différence plus grande entraînerait un bit de signe ou un exposant différent.

Mise en œuvre :

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

Évaluation :

Bien que cette approche puisse paraître prometteuse, elle souffre limitations :

  • Perte de précision : La comparaison au niveau du bit ignore la précision des flottants, ce qui entraîne des inexactitudes potentielles.
  • Résultats incohérents : En fonction de la représentation binaire spécifique, cette méthode peut ne pas toujours renvoyer des résultats cohérents. Par exemple, deux flotteurs de même magnitude mais de signes différents peuvent avoir des représentations binaires identiques.

Solution recommandée : soustraction à virgule flottante

Une solution plus fiable et Une approche efficace pour obtenir une quasi-égalité consiste simplement à soustraire les deux flottants et à vérifier si la différence est inférieure à une valeur prédéfinie. seuil :

const float64EqualityThreshold = 1e-9

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

Cette méthode préserve la précision des flottants et fournit des résultats cohérents, ce qui en fait une solution robuste pour comparer les valeurs float64 pour une quasi-égalité.

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