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 }
Évaluation :
Bien que cette approche puisse paraître prometteuse, elle souffre limitations :
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 }
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!