Maison >développement back-end >Golang >Pourquoi les comparaisons à virgule flottante dans Go donnent-elles des résultats différents pour les littéraux et les variables ?

Pourquoi les comparaisons à virgule flottante dans Go donnent-elles des résultats différents pour les littéraux et les variables ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-09 15:04:16722parcourir

Why do floating-point comparisons in Go yield different results for literals and variables?

Différences de précision à virgule flottante dans Go : littéraux et variables

Dans Go, le comportement de l'arithmétique à virgule flottante peut sembler contradictoire lors de la comparaison opérations impliquant des littéraux et des variables. Examinons le code suivant :

package main

import (
    "fmt"
)

func main() {
    x := 10.1

    fmt.Println("x == 10.1:        ", x == 10.1)
    fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
    fmt.Println("x*3.0:            ", x*3.0)
    fmt.Println("10.1*3.0:         ", 10.1*3.0)
}

Une fois exécuté, ce code affiche le résultat suivant :

x == 10.1:         true
x*3.0 == 10.1*3.0: false
x*3.0:             30.299999999999997
10.1*3.0:          30.3

Comme le montre le résultat, la comparaison de x*3.0 et 10.1*3.0 est évalué de manière inattendue à faux. Cela soulève la question de savoir pourquoi cet écart se produit et s'il est intentionnel ou s'il s'agit d'un bug.

Comprendre la conception

Dans Go, les littéraux et les constantes à virgule flottante ont une précision illimitée . Cependant, lorsqu'ils sont affectés à des variables typées, leur précision est limitée par les limites du type cible. Dans l'exemple ci-dessus, x := 10.1 stocke le littéral 10.1 dans une variable float64. Cette conversion introduit une certaine perte de précision en raison des limitations du type float64.

En revanche, l'expression 10.1*3.0 effectue une multiplication en virgule flottante directement sur les littéraux, préservant toute leur précision. Cela se traduit par une valeur légèrement différente par rapport à x*3,0, où la précision réduite de x affecte le calcul.

Documentation et ressources

La documentation officielle de Go le reconnaît comportement dans la section "Flotteurs" de l'article Constantes. Il explique que même si les constantes numériques ont une précision arbitraire, elles doivent correspondre au type de destination lorsqu'elles sont attribuées. Des valeurs élevées comme 1e1000 peuvent être utilisées dans des expressions avec d'autres constantes, mais leur précision peut être affectée lorsque le résultat est stocké dans un type plus étroit.

Bien que l'article ne mentionne pas explicitement le comportement spécifique observé dans notre exemple (x*3.0 contre 10.1*3.0), il fournit une compréhension générale de la façon dont les limitations de précision s'appliquent aux constantes et aux variables typées.

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