8
votes

Représentation du flotteur en C

J'essayais de comprendre la représentation des points flottants en C à l'aide de ce code ( float code> et int code> sont 4 octets sur ma machine):

int x = 3;
float y = *(float*) &x;
printf("%d %e \n", x, y);


3 commentaires

en.wikipedia.org/wiki/single_precision_floating-point_format


Sur quelle machine essayez-vous cela? Quelle est l'ordre d'octet de l'hôte? Big Endian? Petit endian?


X86_64 machine Linux. Petit endian.


3 Réponses :


12
votes

Les numéros de points flottants IEEE avec des champs exposants de tous les 0 sont «dénormalisés». Cela signifie que le 1 implicite devant la Mantissa n'est plus actif. Cela permet de représenter de très petits nombres. Voir Cet article Wikipedia pour plus d'explications . Dans votre exemple, le résultat serait 3 * 2 ^ -149


0 commentaires

1
votes

Dans les détails, il est décrit http://fr.wikipedia.org/wiki/eeee_754- 2008 Cette norme supposait que vous changez de MANTISSA à gauche jusqu'à ce que cela me cache un peu de sens (exponeur croissant). Dans votre cas, vous avez une expression 1 + 2 ^ (- 23) - alors vous obtenez une réponse correcte 4.9..e-32


1 commentaires

Pourriez-vous montrer de travailler pour votre réponse? Il ne semble pas être correct en ce qui concerne simplement le brancher 1 + 2 ^ (- 23) ou la réponse correcte étant 4,9E-32.



6
votes

-127 dans l'exposant est réservé aux nombres dénormé. Votre calcul est destiné aux nombres normalisés pendant que votre flotteur est un flotteur dénormé.

Les nombres dénormalisés sont calculés à l'aide d'une méthode similaire, mais:

  1. Exponent est -126
  2. Leader implicite duader n'est plus supposé

    Cela signifie que le calcul est à la place: xxx

    ce qui précède est python, où ** signifie la même chose que < Code> ^


0 commentaires