Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
wie binär anzeigen: 1.27866820620943e148 ?
e2020
myCSharp.de - Member



Dabei seit:
Beiträge: 41

Themenstarter:

wie binär anzeigen: 1.27866820620943e148 ?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7559
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
LittleBoy
myCSharp.de - Member



Dabei seit:
Beiträge: 55

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von LittleBoy am .
private Nachricht | Beiträge des Benutzers
e2020
myCSharp.de - Member



Dabei seit:
Beiträge: 41

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von e2020 am .
private Nachricht | Beiträge des Benutzers
LittleBoy
myCSharp.de - Member



Dabei seit:
Beiträge: 55

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 105

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von rasepretrep am .
private Nachricht | Beiträge des Benutzers
LittleBoy
myCSharp.de - Member



Dabei seit:
Beiträge: 55

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers