Schweben, auf binäre
Ich versuche zu konvertieren, eine floating-point-Zahl binäre Darstellung; wie kann ich das erreichen?
Mein Ziel ist es jedoch nicht beschränkt werden, die durch 2m also ich bin der Hoffnung, für etwas, das könnte leicht erweitert werden, um jeder Basisstation (3, 4, 8) ecc.
Habe ich eine einfache Implementierung so weit für Ganzzahlen:
import string
LETTER = '0123456789' + string.ascii_lowercase
def convert_int(num, base):
if base == 1:
print "WARNING! ASKING FOR BASE = 1"
return '1' * num if num != 0 else '0'
if base > 36: raise ValueError('base must be >= 1 and <= 36')
num, rest = divmod(num, base)
rest = [LETTER[rest]]
while num >= base:
num, r = divmod(num, base)
rest.append(LETTER[r])
rest.reverse()
return (LETTER[num] if num else '') + ''.join(str(x) for x in rest)
jede Hilfe dankbar 🙂
edit:
def convert_float(num, base, digits=None):
num = float(num)
if digits is None: digits = 6
num = int(round(num * pow(base, digits)))
num = convert_int(num, base)
num = num[:-digits] + '.' + num[:digits]
if num.startswith('.'): num = '0' + num
return num
ist das richtig? warum bekomme ich dieses Verhalten?
>>> convert_float(1289.2893, 16)
'509.5094a0'
>>> float.hex(1289.2983)
'0x1.42531758e2196p+10'
p.s.
Wie konvertieren von float-Zahl in eine Binärzahl um?
Ich habe gelesen, dass die Diskussion, aber ich bekomme nicht die Antwort.. ich meine, funktioniert es nur für 0.25, 0.125? und ich verstehe nicht den Satz "muss in umgekehrter Reihenfolge"...
Willst du floating-point-zahlen (die aus der
significant_digits
und ein exponent
) oder eine Natürliche Zahl mit einem "binäre Stelle" dazwischen? Beide sind eigentlich nicht schwer (wenn man einmal Begriffen der Mathematik), aber anders.InformationsquelleAutor Ant | 2011-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nächste Antwort mit ein bisschen Theorie.
Erklärung unten nicht erklären, IEEE Floating Point standard nur Allgemeine Ideen zur Darstellung von floating-point-zahlen
Jeder float-Zahl wird dargestellt als ein Bruchteil multipliziert mit einem Exponenten, multipliziert mit einem Zeichen. Zusätzlich gibt es so genannte bias für "exponent", erklärt Balg.
So haben wir
Beispiel für base 2 mit 8-bit-Bruch-und 8-bit-exponent
Bits im Bruchteil erzählen Sie uns, welche Summanden (zahlen Hinzugefügt werden) aus folgenden Reihenfolge aufgenommen werden, in dem dargestellten Zahlenwert
2^-1 + 2^-2 + 2^-3 + 2^-4 + 2^-5 + 2^-6 + 2^-7 + 2^-8
Also, wenn Sie sagen 01101101 in Bruch-Teil gibt es
0*2^-1 + 1*2^-2 + 1*2^-3 + 0*2^-4 + 1*2^-5 + 1*2^-6 + 0*2^-7 + 1*2^-8 = 0.42578125
Nun nicht-null-zahlen, die darstellbar sind, die Weg fallen zwischen
2 ** -8 = 0.00390625 und 1 - 2**-8 = 0.99609375
Hier der exponent Teil kommt. Der Exponent ermöglicht uns, sind sehr große zahlen, die durch Multiplikation der Bruchteil von exponent. Wenn wir also ein 8bit exponent multiplizieren wir die resultierende Bruchteil von zahlen zwischen 0 und 2^255.
Also gehen wir zurück zum obigen Beispiel nehmen wir den Exponenten der 11000011 = 195.
Haben wir den Bruchteil der 01101101 = 0.42578125-exponent-Teil 11000011 = 195. Es gibt uns die Anzahl 0.42578125 * 2^195, das ist wirklich große Zahl.
So weit wir können, stellen nicht-null-zahlen zwischen 2^-8 * 2^0 und (1-2^-8) * 2^255. Dies ermöglicht sehr große zahlen, aber nicht für sehr kleine zahlen. Um darstellen zu können kleine zahlen, die wir haben, gehören so genannte Tendenz in unserer Exponenten. Es ist eine Nummer, die wird immer abgezogen exponent damit für die Repräsentation von kleinen zahlen.
Werfen wir einen bias von 127. Nun sind alle Exponenten werden subtrahiert, 127. Also zahlen, die dargestellt werden können, sind zwischen 2^-8 * 2^(0 - 127) und (1-2^-8) * 2^(255 - 127 = 128)
Beispiel, die Zahl ist jetzt 0.42578125 * 2^(195-127 = 68), die ist immer noch ziemlich groß.
Beispiel endet
Um das besser verstehen, versuchen, Experimentieren Sie mit verschiedenen Basen und Größen für Bruch-und exponentielle Teil. Am Anfang versuchen Sie nicht, mit ungeraden Basen, weil es nur erschwert Dinge notwendig.
Sobald Sie verstehen, wie diese Vertretung funktioniert, sollten Sie in der Lage sein, code zu schreiben, erhalten Sie die Darstellung einer Zahl in einer beliebigen Basis, Bruch - /exponential-Teil-Kombination.
InformationsquelleAutor stmi
Für Schwimmer gibt es integrierte Methode mit hex().
http://docs.python.org/library/stdtypes.html#float.hex
Gibt es Sie, die mit der hexadezimalen Darstellung der angegebenen Zahl. Und die übersetzung form von hex zu Binär ist trivial.
Beispiel:
wie "translation form von hex zu Binär" hier für
'0x1.0800000000000p+3'? Thanks!
Ich meine natürlich eine programmatische Art und Weise, d.h. wie die Verwendung von python zu übersetzen
'0x1.0800000000000p+3'
zu'1000.01'
InformationsquelleAutor stmi
Wenn Sie konvertieren wollen
float
einen string mitd
Ziffern nach demdecimalradix Punkt:base**d
..
Charakterd
Ziffern vor dem Ende.Beispielsweise zum darstellen von 0.1 in der Basis 12 mit 4Dezimalzahl dozenal Orte,
124A
0.124A
genial Lösung. Wäre schön zu wissen, wie man die Letzte Zugabe der radix Punkt. anstelle von 1.74a3 bekomme ich 174a3
InformationsquelleAutor dan04
Dies ist nicht die gleiche Art von Binärdaten, die Sie wollen, aber das wird konvertieren einer IEEE 754 in es ist Zeichen, die Mantisse und der base, die verwendet werden können zum erstellen einer hex-Darstellung in eine ziemlich direkte Art und Weise. Beachten Sie, dass der 'Wert' der Mantisse ist 1+BINÄRE, wo BINÄRE ist die binäre Darstellung - daher die -1 in der Rückkehr.
Schrieb ich diesen code und sage es öffentlich.
InformationsquelleAutor S James S Stapleton
Gibt es einen trick, den ich beobachtet, dass wir tun können, mit einfachen string-Manipulationen. Ich fühlte diese Methode ist einfacher als andere Methoden, die ich stieß.
Ausgabe :
Hoffe, es wird hilfreich sein, um jemanden.
InformationsquelleAutor kuldeep725
Beantwortung der Titel direkt und mit float.hex, was nutzt 64bit IEE754, könnte man schreiben, diese Methode:
Beachten Sie jedoch, dass dies nicht funktioniert, NaN und Inf.
InformationsquelleAutor Ozbolt