Les types à virgule flottante (tels que simple et double) sont représentés en mémoire par un signe, une mantisse et un exposant. Considérez-le comme une notation scientifique:
Sign*Mantissa*Base^Exponent
Ils - comme vous pouvez vous y attendre - utilisent la base 2. Il existe d'autres ajustements qui permettent de représenter l'infini et NaN, et l'exposant est décalé (y reviendra), et un raccourci pour la mantisse (y reviendra aussi) . Recherchez la norme IEEE 754 qui couvre sa représentation et ses opérations pour plus de détails.
Pour nos besoins, nous pouvons l'imaginer comme un nombre binaire "mantisse" et un "exposant" qui vous indique où placer le séparateur décimal.
Dans le cas de Single, nous avons 1 bit pour le signe he, 8 pour l'exposant et 23 pour la mantisse.
Maintenant, le fait est que nous allons stocker la mantisse du chiffre le plus significatif. N'oubliez pas que tous les zéros à gauche ne sont pas pertinents. Et étant donné que nous travaillons en binaire, nous savons que le chiffre le plus significatif est un 1 ※. Eh bien, puisque nous le savons, nous n'avons pas à le stocker. Grâce à ce raccourci, la plage effective de la mantisse est de 24 bits.
※: À moins que le nombre que nous stockons soit nul. Pour cela, nous aurons tous les bits mis à zéro. Cependant, si nous essayons d'interpréter cela sous la description que j'ai donnée, vous auriez un 2 ^ 24 (le 1 implicite) multiplié par 1 (2 à la puissance de l'exposant 0). Donc, pour y remédier, l'exposant zéro est une valeur spéciale. Il existe également des valeurs spéciales pour stocker l'infini et NaN dans l'exposant.
Selon le décalage de l'exposant - en plus d'éviter les valeurs spéciales - son décalage permet de placer le point décimal avant le début de la mantisse ou après sa fin, sans avoir besoin d'avoir un signe pour l'exposant.
Cela signifie que pour les grands nombres, le type à virgule flottante placera le point décimal au-delà de la fin de la mantisse.
N'oubliez pas que la mantisse est un nombre de 24 bits. Il ne représentera jamais un nombre de 25 bits ... il n'a pas ce bit supplémentaire. Ainsi, le single ne peut pas distinguer entre 2 ^ 24 et 2 ^ 24 + 1 (ce sont les premiers nombres de 25 bits, et ils diffèrent sur le dernier bit, qui n'est pas représenté dans le single).
Ainsi, pour les entiers, la plage du simple est de -2 ^ 24 à 2 ^ 24. Et essayer d'ajouter 1 à 2 ^ 24 donnera 2 ^ 24 (car en ce qui concerne le type, 2 ^ 24 et 2 ^ 24 + 1 ont la même valeur). Essayez-le en ligne . C'est pourquoi il y a une perte d'informations lors de la conversion d'un entier en un seul. Et c'est aussi pourquoi une boucle qui utilise un simple ou un double pourrait en fait être une boucle infinie sans que vous vous en rendiez compte.