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)
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
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!