Maison > développement back-end > Golang > Pourquoi la multiplication à virgule flottante produit-elle des résultats différents avec des variables et des littéraux en Go ?

Pourquoi la multiplication à virgule flottante produit-elle des résultats différents avec des variables et des littéraux en Go ?

Mary-Kate Olsen
Libérer: 2024-12-04 12:23:06
original
200 Les gens l'ont consulté

Why Does Floating-Point Multiplication Produce Different Results with Variables and Literals in Go?

Multiplication à virgule flottante variable ou littérale dans Go : un casse-tête de précision

Dans Go, comparer les littéraux à virgule flottante à leurs homologues variables peut donner des résultats surprenants. Considérons le code suivant :

x := 10.1
fmt.Println("x*3.0 == 10.1*3.0:", x*3.0 == 10.1*3.0)
Copier après la connexion

Bien que les opérations de multiplication soient identiques, le résultat est faux. Pourquoi y a-t-il un écart ?

Constantes et précision

Les constantes et les littéraux à virgule flottante dans Go possèdent une précision illimitée. Cependant, lors de l'affectation à une variable typée, la valeur doit être conforme aux contraintes du type. Dans ce cas, x est affecté à un float64, qui a une précision limitée.

Préservation de la précision

Lors de la spécification explicite d'un littéral float, comme dans 10.1*3.0, le la précision totale est maintenue avant que l'opération ne soit effectuée. En revanche, lors de l'attribution d'un littéral flottant à une variable, la précision est perdue lors de la conversion vers le type cible.

Implications

Ce comportement est intentionnel et a des implications pour comparaisons à virgule flottante. Lors de la comparaison d'une variable saisie à son équivalent littéral, les différences de précision peuvent entraîner des résultats inattendus. Comme indiqué dans l'article de blog Go sur les constantes, les constantes numériques existent dans un espace numérique sans contrainte, mais sont confrontées à des limites lorsqu'elles sont attribuées à des types spécifiques.

Exemple

Considérez ce qui suit constante déclarée dans Go :

const Huge = 1e1000
Copier après la connexion

Bien que cette constante puisse être utilisée dans des expressions, elle ne peut pas être affectée à une variable float64 en raison de sa précision excessive. Par conséquent, l'instruction fmt.Println(Huge) ne pourra pas être compilée.

Conclusion

L'écart dans la multiplication à virgule flottante entre les littéraux et les variables provient de la perte de précision lors de l’affectation aux variables typées. Comprendre ce comportement est crucial pour éviter des résultats inattendus et garantir des comparaisons précises dans les opérations Go à virgule flottante.

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