Quel est le format binaire d'un nombre à virgule flottante utilisé par C ++ sur les systèmes Intel?

StackOverflow https://stackoverflow.com/questions/902599

Question

Je suis intéressé à en apprendre davantage sur le format binaire pour un simple ou double type utilisé par C ++ sur les systèmes Intel.

Je l'ai évité l'utilisation de nombres à virgule flottante dans les cas où les données doivent être lues ou écrites potentiellement par un autre système (à savoir des fichiers ou réseau). Je me rends bien compte que je pourrais utiliser des nombres à virgule fixe au lieu, et ce point fixe est plus précis, mais je suis intéressé à en apprendre davantage sur le format à virgule flottante.

Était-ce utile?

La solution

format à virgule flottante est déterminé par le processeur, pas la langue ou le compilateur. Ces jours-ci presque tous les processeurs (y compris toutes les machines de bureau Intel) soit avoir aucune unité à virgule flottante ou avoir un qui est conforme à la norme IEEE 754. Vous obtenez deux ou trois tailles différentes (Intel avec SSE offre 32, 64 et 80 bits) et chaque on a un bit de signe, un exposant et une mantisse. Le nombre représenté est généralement donné par la formule suivante:

sign * (2**(E-k)) * (1 + S / (2**k'))

où k » est le nombre de bits dans la mantisse et k est une constante autour de la gamme moyenne des exposants. Il y a des représentations spéciales pour des valeurs nulles (plus et moins zéro), ainsi que d'autres infinités et « pas un nombre » (NAN).

Il y a bizarreries précises; par exemple, la fraction 1/10 ne peut pas être représenté exactement comme norme IEEE binaire nombre à virgule flottante. Pour cette raison, la norme IEEE prévoit également une représentation décimale, mais cela est principalement utilisé par les calculatrices de poche et non par les ordinateurs à usage général.

Lectures recommandées: David Golberg Ce que tout informaticien doit savoir sur Virgule flottante arithmétique

Autres conseils

Wikipedia a un résumé raisonnable - voir http://en.wikipedia.org/wiki/IEEE_754 .

Burt si vous voulez transférer des numéros que vous devriez systèmes Situés entre éviter de le faire en format binaire. Soit middleware d'utilisation comme CORBA (plaisante, les gens), Tibco etc., ou se replier sur ce vieux favori, la représentation textuelle.

Cela devrait vous aider à démarrer: http://docs.sun.com /source/806-3568/ncg_goldberg.html. (:

Comme d'autres l'ont noté, il y a beaucoup d'informations sur le format IEEE utilisé par tous les processeurs modernes, mais ce n'est pas où vos problèmes se poseront.

Vous pouvez compter sur tout système moderne en utilisant le format IEEE, mais vous aurez besoin de regarder pour la commande d'octets. Recherchez « boutisme » sur Wikipedia (ou ailleurs). Intel systèmes sont peu endian, beaucoup de processeurs RISC sont big-endian. Permutation entre les deux est trivial, mais vous devez savoir quel type que vous avez.

Traditionnellement, les gens utilisent les formats big-endian pour la transmission. Parfois, les gens comprennent un en-tête indiquant l'ordre des octets qu'ils utilisent.

Si vous voulez la portabilité absolue, la chose la plus simple est d'utiliser une représentation de texte. Cependant qui peut être assez bavard pour les nombres à virgule flottante si vous voulez capturer la pleine précision. 0.1234567890123456e + 123.

La représentation d'Intel est IEEE 754 conforme. Vous trouverez les détails à http: // téléchargement. intel.com/technology/itj/q41999/pdf/ia64fpbf.pdf.

Notez que les constantes décimales à virgule flottante peuvent convertir à différentes valeurs binaires à virgule flottante sur différents systèmes (même avec différents compilateurs sur le même système). La différence serait légère - peut-être seulement aussi grand que 2 ^ -54 pour un double -. Mais est néanmoins une différence

Utilisez les constantes hexadécimaux si vous voulez garantir la même valeur binaire à virgule flottante sur une plate-forme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top