Maison >développement back-end >Golang >Comment puis-je comparer avec précision et efficacité des nombres à virgule flottante dans Go ?

Comment puis-je comparer avec précision et efficacité des nombres à virgule flottante dans Go ?

DDD
DDDoriginal
2024-12-17 21:03:12595parcourir

How Can I Accurately and Efficiently Compare Floating-Point Numbers in Go?

Comparaison Go Float : une approche plus précise et plus efficace

La tâche de comparer deux nombres à virgule flottante (float64) pour l'égalité dans Go implique généralement de gérer les complexités de l'IEEE 754 et la représentation binaire des flotteurs. Bien qu'il existe différentes approches, certains supposent que comparer des représentations binaires avec une tolérance d'un bit est une solution fiable :

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
}

Cependant, cette approche a des limites. La représentation binaire des nombres à virgule flottante n'est pas toujours significative lorsqu'on compare leurs valeurs « presque égales ». Une méthode plus directe et plus précise consiste à soustraire les deux nombres pour déterminer leur différence :

package main

import (
    "fmt"
    "math"
)

const float64EqualityThreshold = 1e-9

func almostEqual(a, b float64) bool {
    return math.Abs(a - b) <= float64EqualityThreshold
}

func main() {
    a := 0.1
    b := 0.2
    fmt.Println(almostEqual(a + b, 0.3))
}

Cette approche définit un seuil pour la différence maximale acceptable et convient à la plupart des scénarios pratiques où la comparaison des flotteurs pour l'égalité est requise . Il fournit une solution plus précise et efficace que la comparaison de représentations binaires.

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!

Déclaration:
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