87 votes

Représentation binaire d'un float en Python (bits non hex)

Comment obtenir la chaîne sous forme de représentation binaire IEEE 754 d'un flottant 32 bits ?

Exemple

1.00 -> '00111111100000000000000000000000'

0voto

dkhammond Points 1

Plusieurs de ces réponses ne fonctionnaient pas comme écrit avec Python 3, ou ne donnaient pas la représentation correcte des nombres négatifs à virgule flottante. J'ai trouvé la réponse suivante qui fonctionne pour moi (bien qu'elle donne une représentation 64 bits, ce dont j'avais besoin)

def float_to_binary_string(f):
    def int_to_8bit_binary_string(n):
        stg=bin(n).replace('0b','')
        fillstg = '0'*(8-len(stg))
        return fillstg+stg
    return ''.join( int_to_8bit_binary_string(int(b)) for b in struct.pack('>d',f) )

0voto

Somen Das Points 7

J'en ai fait un très simple. Vérifiez-le s'il vous plaît. Et si vous pensez qu'il y a une erreur, faites-le moi savoir. Cela fonctionne bien pour moi.

sds=float(input("Enter the number : "))
sf=float("0."+(str(sds).split(".")[-1]))
aa=[]

while len(aa)<15:
    dd=round(sf*2,5)
    if dd-1>0:

        aa.append(1)
        sf=dd-1

    else:

        sf=round(dd,5)
        aa.append(0)

des=aa[:-1]
print("\n")
AA=([str(i) for i in des])

print("So the Binary Of : %s>>>"%sds,bin(int(str(sds).split(".")[0])).replace("0b",'')+"."+"".join(AA))

ou dans le cas d'un nombre entier, utilisez simplement bin(integer).replace("0b",'')

-1voto

Robert Hughes Points 1

Vous pouvez utiliser le format .pour la représentation la plus simple des bits à mon avis :

mon code ressemblerait à quelque chose comme :

def fto32b(flt):
# is given a 32 bit float value and converts it to a binary string
if isinstance(flt,float):
    # THE FOLLOWING IS AN EXPANDED REPRESENTATION OF THE ONE LINE RETURN
            #   packed = struct.pack('!f',flt) <- get the hex representation in (!)Big Endian format of a (f) Float
            #   integers = []
            #   for c in packed:
            #       integers.append(ord(c))    <- change each entry into an int
            #   binaries = []
            #   for i in integers:
            #       binaries.append("{0:08b}".format(i)) <- get the 8bit binary representation of each int (00100101)
            #   binarystring = ''.join(binaries) <- join all the bytes together
            #   return binarystring
    return ''.join(["{0:08b}".format(i) for i in [ord(c) for c in struct.pack('!f',flt)]])
return None

Sortie :

>>> a = 5.0
'01000000101000000000000000000000'
>>> b = 1.0
'00111111100000000000000000000000'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X