Maison  >  Article  >  développement back-end  >  Analyser les inexactitudes en virgule flottante Golang

Analyser les inexactitudes en virgule flottante Golang

PHPz
PHPzoriginal
2023-04-06 08:54:47821parcourir

Golang est un langage de programmation très populaire. Sa simplicité, son efficacité, sa sécurité et d'autres caractéristiques constituent la base de son application dans le cloud computing, la conteneurisation, la blockchain et d'autres domaines. Bien que Golang ait une histoire de dix ans, il existe quelques problèmes avec le traitement des nombres à virgule flottante. Cet article analysera l'inexactitude des nombres à virgule flottante Golang.

Tout d’abord, nous devons savoir comment les nombres à virgule flottante sont stockés. Golang utilise des nombres à virgule flottante double précision de 64 bits (c'est-à-dire float64) au niveau inférieur pour stocker les nombres à virgule flottante, où une partie des chiffres binaires représente les chiffres décimaux et une partie des chiffres binaires représente les chiffres entiers. En raison de la précision limitée du stockage binaire interne des nombres à virgule flottante de l'ordinateur, seuls des nombres binaires limités peuvent être utilisés pour représenter approximativement des nombres réels irrationnels, il y a donc une erreur d'arrondi.

Par exemple, si nous exprimons 0,1 sous forme binaire, nous pouvons obtenir 0,0001 1001 1001 1001..., mais en raison d'erreurs d'arrondi, ce qui est réellement stocké à l'intérieur de l'ordinateur est 0,0001 1001 1001 1001 1001 1001 1001 1010..., ce qui donne à Golang des résultats étranges lorsqu'il s'agit de 0.1.

Ce qui suit est un morceau de code Golang qui utilise une boucle for pour afficher les 10 premières décimales de 0,1 :

package main

import "fmt"

func main() {
    var n float64 = 0.1
    for i := 0; i < 10; i++ {
        fmt.Println(n)
        n += 0.1
    }
}

Le résultat de sortie attendu est :

0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

Cependant, en fait, le résultat de sortie est :

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999

De toute évidence, Golang Au lieu d'être capable de gérer 0,1 avec précision, des résultats tels que 0,30000000000000004 et 0,799999999999999999 sont apparus. En effet, à l’intérieur de l’ordinateur, 0,1 est représenté approximativement comme une boucle infinie de nombres binaires. Chaque fois qu’une opération d’addition est effectuée, l’erreur d’arrondi sera amplifiée, conduisant finalement à des erreurs asymptotiques.

En plus des opérations d'addition, d'autres opérations à virgule flottante dans Golang, telles que la soustraction, la multiplication, la division, etc., présentent également des problèmes de précision. De plus, un dépassement de capacité ou un dépassement inférieur peuvent également se produire lorsqu'il s'agit de nombres à virgule flottante très grands ou très petits.

Afin d'éviter ces problèmes, vous pouvez utiliser le package math/big fourni par Golang pour gérer de grands nombres et des nombres à virgule flottante de haute précision. De plus, pour certains scénarios d'application qui nécessitent des exigences très précises, vous pouvez envisager d'utiliser des langages de programmation tels que C++ ou Python pour les implémenter.

Pour résumer, Golang aura quelques inexactitudes lors du traitement des nombres à virgule flottante, causées par des erreurs d'arrondi au sein de l'ordinateur. Afin d'éviter ces problèmes, il est nécessaire de sélectionner des langages de développement et des bibliothèques appropriés en fonction de scénarios d'application spécifiques pour garantir l'exactitude des résultats de calcul.

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