Maison >développement back-end >Golang >Go Float Equality : comparaison au niveau des bits et basée sur Epsilon – Quel est le meilleur ?
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 }
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 }
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!