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'
6 Réponses :
Si vous souhaitez convertir un Par exemple, pour représenter 0,1 dans la base 12 avec 4 float code> à une chaîne avec
d code> chiffres après le point
décimal s> Radix Point: P>
base ** d code>. li>
. code> caractère
d code> chiffres avant la fin. LI>
ol>
Decimal S> Dinzenal Places, P>
124a code> li>
0.124A CODE> LI>
ol>
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
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'
@stmi: Comment "Formulaire de traduction Hex to binaire" ici pour '0x1.0800000000000P + 3'? Merci! code>
@stmi: Je veux dire bien sûr une voie programmatique, c'est-à-dire comment utiliser python pour traduire '0x1.080000000000000P + 3' code> à
'1000.01' code>
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".
Suivant réponse avec un peu de théorie. P>
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 EM> P> P> P> P> P>
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. P>
Nous avons donc p>
Exemple de base 2 avec fraction 8 bits et exponent 8 bits fort> p>
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é P>
2 ^ -1 + 2 ^ -2 + 2 ^ -3 + 2 ^ -4 + 2 ^ -5 + 2 ^ -6 + 2 ^ -7 + 2 ^ -8 p>
Donc, si vous avez dit 01101101 en partie fractionnée, il donne p>
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 P>
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 P>
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. P>
Retour à l'exemple ci-dessus prenons l'exposant de 11000011 = 195. P>
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. P>
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. P>
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) P>
exemple de numéro est maintenant 0.42578125 * 2 ^ (195-127 = 68) qui est toujours assez grand. p>
Exemple extrémise forte> p>
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. P>
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. p>
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;
Répondre au titre directement et à l'aide de Float.Hex, qui utilise 64 bits IEE754, on pourrait écrire cette méthode: note cependant, cela ne fonctionne pas pour NAN et INF. p> p>
Nice merci, comment revenir? Pourriez-vous partager la fonction bin_to_float (x) s'il vous plaît?
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
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' code>
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 code> et un exposant
code>) 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.