Pour comprendre la plage de valeurs et la précision de calcul de float et double, vous devez d'abord comprendre comment les nombres décimaux sont stockés dans les ordinateurs :
Par exemple : 78.375 est un nombre décimal positif. Pour stocker ce nombre dans un ordinateur, il doit être représenté au format à virgule flottante. Effectuez d'abord la conversion binaire :
PS : Le point décimal binaire est différent du point décimal. Après le point décimal binaire se trouvent les puissances négatives de 2 ; après le point décimal se trouvent les puissances négatives de 10.
1. Conversion binaire des nombres décimaux (nombres à virgule flottante)
La partie entière de 78.375 :
La partie fractionnaire :
Ainsi, la forme binaire de 78.375 est 1001110.011
Ensuite, en utilisantla notation scientifique binaire,nous avons
Notez qu'après conversion, le nombre représenté en notation scientifique binaire possède une base, un exposant et une partie fractionnaire. C'est ce qu'on appelleun nombre à virgule flottante.
2. Stockage des nombres à virgule flottante dans les ordinateurs
Dans les ordinateurs, le stockage de ce nombre utilise la représentation à virgule flottante, qui est divisée en trois parties principales :
La première partie est utilisée pour stocker lebit de signe,utilisé pour distinguer le positif du négatif. Ici, il vaut 0, ce qui indique un nombre positif.
La deuxième partie est utilisée pour stocker l'exposant,ici l'exposant est 6 en décimal.
La troisième partie est utilisée pour stocker lafraction,ici la partie fractionnaire est 001110011.
Notez que l'exposant peut aussi être positif ou négatif ; cela sera abordé plus tard.Comme le montre la figure ci-dessous :

Par exemple, le type float est de 32 bits et utilise une représentation en virgule flottante à simple précision :
Le bit de signe occupe 1 bit et sert à représenter les nombres positifs et négatifs.
Les bits d'exposant occupent 8 bits et servent à représenter l'exposant.
Les bits de fraction occupent 23 bits et servent à représenter la fraction, les bits manquants étant complétés par 0.
Le type double est de 64 bits et utilise une représentation en virgule flottante à double précision :
Le bit de signe occupe 1 bit, les bits d'exposant occupent 11 bits et les bits de fraction occupent 52 bits.
À ce stade, vous pouvez déjà entrevoir que :
Les bits d'exposant déterminent la plage de valeurs,car plus les nombres que les bits d'exposant peuvent représenter sont grands, plus les nombres qui peuvent être représentés sont grands !
Les bits de fraction déterminent la précision de calcul,car plus les nombres que les bits de fraction peuvent représenter sont grands, plus la précision de calcul est grande !
Ce n'est peut-être pas encore assez clair, alors prenons des exemples :
float n'a que 23 bits de fraction, c'est-à-dire 23 bits binaires. Le nombre décimal maximal qu'il peut représenter est 2 puissance 23, soit 8,388,608, c'est-à-dire 7 chiffres décimaux. Strictement parlant, la précision ne peut garantir que 6 chiffres décimaux de calcul avec une certitude de 100 %.
double a 52 bits de fraction, correspondant à une valeur décimale maximale de 4,503,599,627,370,496. Ce nombre a 16 chiffres, donc la précision de calcul ne peut garantir que 15 chiffres décimaux de calcul avec une certitude de 100 %.
PS : Les calculatrices scientifiques courantes, comme celles utilisées au lycée, prennent généralement en charge un maximum de 15 chiffres de calcul ; au-delà, la précision est insuffisante. En programmation réelle, le type double est aussi plus souvent utilisé, car il peut garantir 15 chiffres de calcul. Si un calcul de précision encore plus élevée est nécessaire, d'autres types de données sont requis, comme BigDecimal en Java, qui prend en charge un calcul de plus haute précision.
3. Décalage des bits d'exposant et représentation non signée
Notez que l'exposant peut être négatif ou positif, c'est-à-dire,l'exposant est un entier signé.Les calculs avec des entiers signés sont plus pénibles qu'avec des entiers non signés. Par conséquent, pour réduire les ennuis inutiles, lors du stockage réel de l'exposant, l'exposant doit être converti enun entier non signé.Alors, comment la conversion est-elle effectuée ?
Notez que la partie exposant d'un float est de 8 bits, donc la plage d'exposant est de -126 à +127. Pour éliminer l'impact des nombres négatifs sur les calculs réels (tels que les comparaisons, l'addition et la soustraction, etc.), une simple mise en correspondance peut être appliquée à l'exposant lors de son stockage réel, en ajoutant undécalage.Par exemple, le décalage pour l'exposant d'un float est 127, donc aucun nombre négatif n'apparaît.
Par exemple :
Si l'exposant est 6, ce qui est réellement stocké est 6+127=133, c'est-à-dire, 133 est converti en binaire puis stocké.
Si l'exposant est -3, ce qui est réellement stocké est -3+127=124, c'est-à-dire, 124 est converti en binaire puis stocké.
Lorsque nous devons calculer le nombre décimal réel représenté, il suffit de soustraire le décalage de l'exposant.
Pour le type double correspondant, le décalage de l'exposant lors du stockage est 1023.
4. Enfin
Donc, pour enregistrer la fraction décimale 78.375 avec le type float, vous devez d'abord la convertir en un nombre à virgule flottante, obtenant lebit de signe,et l'exposant,etla partie fractionnaire.Cet exemple a déjà été analysé ci-dessus, donc :
Le bit de signe est 0, les bits d'exposant sont 6+127=133, dont la représentation binaire est 10 000 101, et la partie fractionnaire est 001110011. Veuillez compléter automatiquement par des 0 la partie insuffisante.
Assemblés et représentés comme float, la partie en gras correspond aux bits d'exposant, et le bit le plus à gauche est le bit de signe 0, représentant un nombre positif :
0 10000101 001110011 00000 00000 0000
Si vous utilisez double pour le stocker... calculez-le vous-même ; il y a trop de 0.
Auteur : Boss呱呱
Lien : https://www.zhihu.com/question/46432979/answer/221485161