0

J'ai appris à convertir de décimal en IEEE 754 en here, mais je n'ai aucune idée de la façon de convertir un très grand nombre sans avoir à tout diviser par la méthode expliquée sur le poste.Comment convertir un grand nombre (par exemple 1,23e29) en format à virgule flottante simple précision IEE 754?

Par exemple, je dois convertir -1.5845632e29 au point flottant simple précision IEEE 754, y a-t-il un moyen plus simple que d'obtenir la base de journal 2 de ce grand nombre?

+0

grand nombre ne peuvent pas tenir dans un format IEEE-754. Pourquoi n'utilisez-vous pas simplement une bibliothèque bignum? –

+0

-1,5845632e29 est dans la plage représentable par un nombre 'binary32' IEEE-754. Pourquoi est-ce un problème de calculer le log2 pour obtenir l'exposant? Dans le pire des cas, il peut être calculé par une itération qui divise par deux le nombre dans chaque étape jusqu'à ce que le résultat soit dans [1,2). – njuffa

+1

Effectuer des conversions de base * avec précision * est un problème difficile, je suggère de consulter le document suivant comme point de départ: William D.Clinger, "Comment lire les nombres à virgule flottante avec précision." * Notices ACM SIGPLAN * 39.4 (2004): 360-371. – njuffa

Répondre

1

Les exemples ci-dessous utilisent Python. Notez que cela suppose que vous êtes plus intéressé par un moyen rapide de le calculer qu'une réponse très précise.

Vous ne pouvez pas simplement utiliser la base de journal 2 sur l'ensemble, cela ne vous donnera qu'un exposant raisonnable. Ensuite, pour trouver la mantisse, vous pouvez diviser la partie fractionnaire du résultat de l'exposant et élever deux à cette puissance, puis multiplier par deux la puissance du nombre de bits de la mantisse. Le signe doit être traité séparément.

Ce qui suit donne un exposant (sans biais) et de mantisse (1 + 23 bits représenté en hexadécimal):

math.log(1.5845632e29, 2) 
96.99999995421683 
hex(int(math.floor(2**0.99999995421683*2**23))) 
'0xffffff' 

Pour combiner le tout, masquer la sous-entendu une de la mantisse, changement de l'exposant + biais, et prenez le bit de signe:

hex((0xffffff & 0x7fffff) | ((96+127) << 23) | (1 << 31)) 

la technique a des limites ci-dessus - il ne se coince pas d'exceptions et il peut y avoir des problèmes avec précision. Et méfiez-vous que pour les petits nombres, vous devez utiliser la fraction négative pour calculer la mantisse. Pour ce faire plus précisément ou pour différents formats, vous devrez peut-être faire le tout sans fonctions mathématiques à virgule flottante.

Voici les étapes approximatives d'une technique qui fonctionne bien si votre outil ou votre langage peut prendre en charge des entiers arbitrairement grands. C'est facile en Python, par exemple. C vous avez besoin de bibliothèques spéciales.

  1. Écrivez le numéro comme un grand nombre entier de la valeur réelle
  2. Trouver la puissance de deux juste en dessous
  3. Multiplier par deux à la puissance du nombre de bits de mantisse dont vous avez besoin, appliquer tout nécessaire d'arrondi , puis passez à droite par l'exposant.
  4. Calculer l'exposant IEEE en ajoutant le biais