6
votes

Flotter à binaire

J'essaie de convertir un numéro de point flottant en représentation binaire; Comment puis-je atteindre cet objectif? Mon objectif est cependant de ne pas être limité par 2M de 2m, donc j'espère que quelque chose qui pourrait être facilement étendu à n'importe quelle base (3, 4, 8) ECC.

J'ai une implémentation directe jusqu'à présent pour les entiers : P>

>>> convert_float(1289.2893, 16)
'509.5094a0'
>>> float.hex(1289.2983)
'0x1.42531758e2196p+10'


2 commentaires

La réponse à la question précédente me semble assez évidente. AVERTISSEMENT: L'arithmétique flottante avec des bases impaires n'est généralement pas recommandée.


Voulez-vous des numéros de points flottants (qui consiste en significatif_digits et un exposant ) ou un numéro naturel avec un "point binaire" entre? Les deux ne sont en réalité pas si difficile (une fois que vous grocez les mathématiques), mais différents.


6 Réponses :


9
votes

Si vous souhaitez convertir un float à une chaîne avec d chiffres après le point décimal Radix Point:

  1. multiplier le numéro par base ** d .
  2. rond à l'entier le plus proche.
  3. Convertissez l'entier en une chaîne.
  4. Insérez le . caractère d chiffres avant la fin.

    Par exemple, pour représenter 0,1 dans la base 12 avec 4 Decimal Dinzenal Places,

    1. 0,1 × 12 4 = 2073.6
    2. rond dans l'entier le plus proche → 2074
    3. Convertir en chaîne → 124a
    4. Ajouter un point RADIX → 0.124A

2 commentaires

Merci! Je pense que c'est exactement ce que je cherchais; 1) Pouvez-vous expliquer pourquoi fonctionne? et 2) j'ai des problèmes avec ça..Can vous jetez un coup d'œil aux édits de ma réponse? Merci ;)


Solution géniale. Serait bien de savoir comment faire l'ajout final du point Radix. au lieu de 1,74a3, je reçois 174a3



16
votes

Pour les flotteurs Il y a une méthode intégrée Hex ().

http: // docs. python.org/library/sttingtypes.html#float.hex p>

Il vous donne la représentation hexadécimale d'un nombre donné. Et le formulaire de traduction Hex to binaire est trivial. P>

Par exemple: P>

In [15]: float.hex(1.25)
Out[15]: '0x1.4000000000000p+0'

In [16]: float.hex(8.25)
Out[16]: '0x1.0800000000000p+3'


4 commentaires

@stmi: Comment "Formulaire de traduction Hex to binaire" ici pour '0x1.0800000000000P + 3'? Merci!


@stmi: Je veux dire bien sûr une voie programmatique, c'est-à-dire comment utiliser python pour traduire '0x1.080000000000000P + 3' à '1000.01'


Il devrait y avoir une règle contre "l'énonçant quelque chose est triviale". Surtout quand ne pas l'expliquer. -1


C'est exactement le but de dire que, de dire "Je ne vais pas expliquer cette partie, mais c'est facile pour que vous puissiez le comprendre avec peu de travail".



12
votes

Suivant réponse avec un peu de théorie.

Explication ci-dessous n'explique pas l'IEEE Point flottant Standard Seules des idées générales concernant la représentation des numéros de points flottants

Chaque numéro de flotteur est représenté sous la forme d'une pièce fractionnée multipliée par un exposant multiplié par un signe. De plus, il y a aussi appelé biais pour exponent, qui sera expliqué ci-dessous.

Nous avons donc

  1. signe de signe
  2. chiffres à partir de fractionnaires
  3. Exposant composant chiffres

    Exemple de base 2 avec fraction 8 bits et exponent 8 bits

    Les bits en fraction font-nous savoir quels Sumbands (numéros à ajouter) de la séquence ci-dessous doivent être inclus dans la valeur du numéro représenté

    2 ^ -1 + 2 ^ -2 + 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -7 + 2 ^ -8

    Donc, si vous avez dit 01101101 en partie fractionnée, il donne

    0 * 2 ^ -1 + 1 * 2 ^ -2 + 1 * 2 ^ -3 + 0 * 2 ^ -4 + 1 * 2 ^ -4 + 1 * 2 ^ -6 + 0 * 2 ^ - 7 + 1 * 2 ^ -8 = 0.42578125

    Numéros non nuls non-zéro représentant de cette façon de tomber entre 2 ** -8 = 0,00390625 et 1 - 2 ** - 8 = 0,99609375

    Ici, la partie exposante est entrée. Exponent nous permet de représenter de très gros nombres en multipliant la partie fraction par exponent. Donc, si nous avons un exposant 8 bits, nous pouvons multiplier la fraction résultante par chiffres compris entre 0 et 2 ^ 255.

    Retour à l'exemple ci-dessus prenons l'exposant de 11000011 = 195.

    Nous avons une partie fractionnée de 01101101 = 0.42578125 et une partie exposante 11000011 = 195. Cela nous donne le nombre 0.42578125 * 2 ^ 195, c'est vraiment grand nombre.

    jusqu'à présent, nous pouvons représenter des nombres non nuls entre 2 ^ -8 * 2 ^ 0 et (1-2 ^ -8) * 2 ^ 255. Cela permet de très grandes nombres mais pas pour de très petits nombres. Afin de pouvoir représenter de petits nombres, nous devons inclure un biais appelé biais dans notre exposant. C'est un nombre qui sera toujours soustrait de l'exposant afin de permettre la représentation de petits nombres.

    Prenons un biais de 127. Tous les exposants sont maintenant soustraits 127. Les chiffres pouvant être représentés sont compris entre 2 ^ -8 * 2 ^ (0 à 127) et (1-2 ^ -8) * 2 ^ ( 255 - 127 = 128)

    exemple de numéro est maintenant 0.42578125 * 2 ^ (195-127 = 68) qui est toujours assez grand.

    Exemple extrémise

    Afin de mieux comprendre, essayez d'expérimenter différentes bases et tailles pour une partie fractionnelle et exponentielle. Au début, n'essayez pas avec des bases étrange car cela ne complique que les choses nécessaires.

    Une fois que vous devez saisir la manière dont cette représentation devait être capable d'écrire du code pour obtenir une représentation de n'importe quel nombre dans n'importe quelle base, une combinaison de pièces fractionnelle / exponentielle.


0 commentaires

1
votes

Ce n'est pas le même style de représentation binaire que vous souhaitez, mais cela convertira un IEEE 754 en signe de son signe, de la mantissie et de la base, qui peut être utilisé pour créer une représentation hexagonale de manière assez simple. Notez que la «valeur» de la Mantissa est de 1 + binaire, où Binary est la représentation binaire - d'où la -1 dans le retour.

J'ai écrit ce code et je la déclare le domaine public. P>

    def disect_float(f):
      f = float(f); #fixes passing integers
      sign = 0x00; #positive
      exp = 0;
      mant = 0;
      if(f < 0): #make f positive, store the sign
        sign = '-'; #negative
        f = -f;
      #get the mantissa by itself
      while(f % 1 > 0): #exp is positive
        f*=2
        exp+=1
      #while(f % 1 > 0):
      tf = f/2;
      while(tf % 1 <= 0): #exp is negative
        exp-=1;
        f=tf;
        tf=f/2;
        if(exp < -1024): break;
      mant=int(f);
      return sign, mant-1, exp;


0 commentaires

0
votes

Répondre au titre directement et à l'aide de Float.Hex, qui utilise 64 bits IEE754, on pourrait écrire cette méthode: xxx

note cependant, cela ne fonctionne pas pour NAN et INF.


1 commentaires

Nice merci, comment revenir? Pourriez-vous partager la fonction bin_to_float (x) s'il vous plaît?



1
votes

Il y a un astuce que j'ai observé que nous pouvons faire en utilisant des manipulations de chaîne simples. J'ai ressenti cette méthode pour être plus simple que d'autres méthodes que j'ai rencontrées.

13.3125


1 commentaires

Nice, mais c'est le contraire de ce qui est demandé, et non le moyen standard de stocker des données de flotteur binaires. >>> bac (3125) '0B110000110101'