Plages du type de données à virgule flottante en C?

Je lis un livre en C, parlant de plages de virgule flottante, l’auteur a donné le tableau:

entrez la description de l'image ici

Je ne sais pas d’où proviennent les chiffres dans les colonnes Smallest Positive et Plus grande valeur.

Ces nombres proviennent de la norme IEEE-754 , qui définit la représentation standard des nombres en virgule flottante. L’article de Wikipedia sur le lien explique comment arriver à ces plages en connaissant le nombre de bits utilisés pour les signes, la mantisse et l’exposant.

Un nombre en virgule flottante de 32 bits contient 23 + 1 bits de mantisse et un exposant de 8 bits (-126 à 127 est cependant utilisé). Le plus grand nombre que vous pouvez représenter est:

(1 + 1 / 2 + ... 1 / (2 ^ 23)) * (2 ^ 127) = (2 ^ 23 + 2 ^ 23 + .... 1) * (2 ^ (127 - 23)) = (2 ^ 24 - 1) * (2 ^ 104) ~= 3.4e38 

Les valeurs pour le type de données float proviennent de 32 bits au total représentant le nombre alloué de la manière suivante:

1 bit: bit de signe

8 bits: exposant p

23 bits: mantisse

L’exposant est stocké sous la forme p + BIAS où BIAS est égal à 127, la mantisse a 23 bits et un 24ème bit caché supposé 1. Ce bit caché est le bit de poids fort (MSB) de la mantisse et l’exposant doit être choisi de manière à que c’est 1.

Cela signifie que le plus petit nombre que vous pouvez représenter est 01000000000000000000000000000000 qui correspond à 1x2^-126 = 1.17549435E-38 .

La plus grande valeur est 011111111111111111111111111111111 , la mantisse est 2 * (1 – 1/65536) et l’exposant est 127, ce qui donne (1 - 1 / 65536) * 2 ^ 128 = 3.40277175E38 .

Les mêmes principes s’appliquent à la double précision, sauf que les bits sont:

1 bit: bit de signe

11 bits: bits d’exposant

52 bits: bits de mantisse

BIAS: 1023

Donc techniquement, les limites proviennent de la norme IEEE-754 pour la représentation des nombres en virgule flottante et voici comment ces limites sont établies.

Comme déjà répondu à dasblinkenlight, les nombres proviennent de la façon dont les nombres en virgule flottante sont représentés dans IEEE-754, et Andreas a une belle décomposition mathématique.

Toutefois, veillez à ce que la précision des nombres en virgule flottante ne soit pas exactement égale à 6 ou 15 chiffres décimaux significatifs, comme le suggère le tableau, car la précision des nombres IEEE-754 dépend du nombre de chiffres binarys significatifs.

  • float a 24 chiffres binarys significatifs – qui, selon le nombre représenté, se traduisent par 6-8 chiffres décimaux de précision.

  • double a 53 chiffres binarys significatifs, ce qui correspond à environ 15 chiffres décimaux.

Une autre réponse de ma part a plus d’explications si vous êtes intéressé.

C’est une conséquence de la taille de la partie exposant du type, comme dans IEEE 754 par exemple. Vous pouvez examiner les tailles avec FLT_MAX, FLT_MIN, DBL_MAX, DBL_MIN dans float.h.