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
Mary-Kate Olsenoriginal
2024-12-10 14:49:16415parcourir

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

Le résultat est :

6161047830682206208

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

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

2^52        : 9007199254740992

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

Cela affichera :

6161047830682206208.000000
6161047830682206208

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

La sortie sera :

7830682206209.000000
7830682206209

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!

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