Laden...

wie binär anzeigen: 1.27866820620943e148 ?

Erstellt von e2020 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.924 Views
E
e2020 Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren
wie binär anzeigen: 1.27866820620943e148 ?

hallo,

ich möchte mir aus bestimmten gründen diese zahl:
1.27866820620943e148
binär anzeigen lassen - ich habe bereits einige umrechnungsmethoden im netz gesehen, die konnten aber mit dieser riesen zahl nichts anfangen - wie kann ich mir denn nun zu dieser zahl den binär-string anzeigen lassen?

bin für jeden tip dankbar!
e2020

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo,

vllt. bringt dich Looking inside a double weiter.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo e2020,

wie soll denn die Zahl binär interpretiert/repräsentiert werden, als floating-point-Zahl (float, double), als decimal oder als (langer) Integer oder noch ganz anders?

herbivore

4.221 Beiträge seit 2005
vor 12 Jahren

Kommt darauf an was Du darstellen willst....

Ev. so: [FAQ] Von Binär nach float

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

L
53 Beiträge seit 2007
vor 12 Jahren

Das ist ja keine Float-Zahl (mehr) sondern ein Integer mit knapp 150 Stellen in der Dezimalschreibweise. Dadurch fällt selbst der Decimal-Typ aus um die Zahl mit einer ausreichenden Genauigkeit zu halten.

Das Ergebnis dürfte also ein wirklich langer String werden.

Eine Möglichkeit wäre, eine BigNum Bibliothek zu suchen (z.B. GnuMpDotNet) - damit sollte die Umwandlung ziemlich schnell zu erledigen sein.

Edit: Mir fällt gerade ein: .NET 4.0 hat doch auch den BigInteger eingeführt - auch damit sollte das ganze eigentlich eine triviale Aufgabe sein.

E
e2020 Themenstarter:in
40 Beiträge seit 2011
vor 12 Jahren

danke für eure hilfe!

@ gfoidl
danke für den link, aber ich erkenne gerade nicht warum du ihn mir zeigen wolltest - in dem code gehts meiner meinung nach nicht um das konvertieren zu/nach binär strings (also zb: 31 zu 0011111 )

@herbivore
repräsentation ist so zweitrangig wie geschwindigkeit - es geht primär um genauigkeit (ab/aufrunden sollte vermieden werden) und deshalb tendiere ich zu langer integer-zahl, aber wie würdest du es machen ? und was meinst du mit noch ganz anders? mir sind alle lösungen recht die korrekt mit positiven zahlen arbeiten können...

@Programmierhans
danke - das muss ich jetzt erstmal ausprobieren...

@LittleBoy
ja, und wie kann ich dieses Integer mit knapp 150 Stellen in der Binärschreibweise darstellen? der string wird 453 stellen haben und ich finde das ist nicht viel.
bitinteger? danke für den tipp - das probiere ich heute aus...

bin für jede weitere idee dankbar!
e2020

L
53 Beiträge seit 2007
vor 12 Jahren

Na ja, das ist doch trivial:

Das Ding in ein BigInteger laden - dann in einer Schleife schauen, ob der BigInteger grade/ungerade ist und entsprechend eine 1 oder 0 an einen String hängen. Dann den BigInteger div 2 rechnen und die Schleife durchlaufen lassen bis das Ding Null ist.

Das einzige Problem ist doch, dass das float nicht die Genauigkeit hat um die Divison durch zwei durchzuführen - das umgehst du mit dem BigInteger und damit wiederum kannst du jeden 08/15-Algorithmus zur Umwandlung nutzen.

R
103 Beiträge seit 2009
vor 12 Jahren

Hallo,

durch 2 teilen müsste auch super und ohne ungenauigkeiten mit nem Float oder double gehen.

Ein double oder float wird ja gerade als x * 2^y gespeichert. Um durch 2 zu teilen muss also nur der Exponent um eins vermindert werden. Das ist ohne Rundungsfehler machbar.

L
53 Beiträge seit 2007
vor 12 Jahren

Bei der Binärdarstellung kommt es aber darauf an, ob das Ergebnis gerade oder ungerade ist - und das ist eben nur dann möglich, wenn die gesamte Genauigkeit gespeichert wird - was der Float für diese Zahlengröße nicht bietet.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo e2020,

wenn es einfach nur darum geht, die Zahl irgendwie (aber natürlich exakt) binär zu repräsentieren, dann würde ich an deiner Stelle so vorgehen: Lass den Dezimaltrenner in der Mantisse weg und reduziere den Exponenten um die Anzahl der Nachkommastellen in der (ursprünglichen) Mantisse. Aus 1.2e20 wird 12e19, aus 1.234e20 wird 1234e17, aus 1.27866820620943e148 wird 127866820620943e134. Anschließend hast du zwei überschaubare Integerzahlen, die du beide ganz normal in binär konvertieren kannst. Anschließend kannst du diese mit einem Trennzeichen (z.B. e) hintereinander oder du reservierst eine bestimmte feste Zahl von Bits (z.B. 8) für den Exponenten und kannst dann die Bits nahtlos zusammenfügen.

herbivore