Maison > développement back-end > Golang > Comment la perte de précision affecte-t-elle la conversion float64 en uint64 de Go ?

Comment la perte de précision affecte-t-elle la conversion float64 en uint64 de Go ?

Mary-Kate Olsen
Libérer: 2024-12-10 14:49:16
original
417 Les gens l'ont consulté

How Does Precision Loss Affect Go's float64 to uint64 Conversion?

Comprendre la conversion Float64 en Uint64

Dans Go, la conversion d'un float64 en un uint64 implique de convertir le float64 en un type de données uint64, ce qui peut entraîner un comportement inattendu en raison de différences de représentation.

Considérez ce qui suit exemple :

package main

func main() {
    n := float64(6161047830682206209)
    println(uint64(n))
}
Copier après la connexion

Le résultat est :

6161047830682206208
Copier après la connexion

Cela semble contre-intuitif, car nous pourrions nous attendre à ce que la valeur uint64 soit la même que celle de float64. L'écart provient de la représentation interne de ces types de données.

Constantes et nombres à virgule flottante

Les constantes dans Go sont représentées avec une précision arbitraire, tandis que les nombres à virgule flottante suivre la norme IEEE 754.

Dans IEEE 754, un nombre à virgule flottante double précision (64 bits) réserve 53 bits pour les chiffres. Dans l'exemple donné :

6161047830682206209
Copier après la connexion

Le nombre dépasse le nombre maximum représentable sous forme d'entier de 53 bits :

2^52        : 9007199254740992
Copier après la connexion

Par conséquent, la constante ne peut pas être représentée exactement comme un float64, et les chiffres sont perdus lors de la conversion en un uint64.

Vérification

Cela peut être vérifié en imprimant la valeur float64 d'origine :

fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))
Copier après la connexion

Cela affichera :

6161047830682206208.000000
6161047830682206208
Copier après la connexion

Le problème ne vient pas de la conversion elle-même, mais de la perte de précision lorsque le float64 a été initialement attribué en raison des limitations de sa représentation.

Exemple avec une conversion valide

Pour un nombre plus petit qui peut être représenté précisément en utilisant 53 bits :

n := float64(7830682206209)
fmt.Printf("%f\n", n)
fmt.Printf("%d\n", uint64(n))
Copier après la connexion

La sortie sera :

7830682206209.000000
7830682206209
Copier après la connexion

Dans ce cas, le float64 peut être représenté exactement et converti en un uint64 sans perte de précision.

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