Große Zahlen, klein Darstellen?

4 Antworten

Was ist der zweck? Soll das ganze lesbar sein? Gehts darum die datenmenge kleiner zu machen?

Ich gehe jetzt mal davon aus das es um die darstellung der zahlen geht und das du von Dezimalzahlen redest.

Du könntest diese Zahlenwerte z.b. in HexaDezimalzahlen umwandeln. Da haste pro stelle 16 möglichkeiten anstatt 10.

1 000 000 währe dann zum beispiel: F4240

In C# dürfte es  dafür bestimmt irgendwelche klassen geben die dir die zahlen umwandeln.

Wenn du allerdings mehr brauchst kannst du dein eigenes zahlensystem entwickeln.

z.b. 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T.. usw,

Dann haste pro stelle schon einiges mehr an zahlen abgedeckt. und die zahl 20 wäre als K darstellbar.

Wie du das allerdings dann umwandelst musst du selbst herausfinden.

Ich habe mir das ycd-Datei-Format vom Weltmeister der Pi-Berechnung abgeschaut und so über 22 TB (über 7 Festplatten!) gespeichert:

Zwar ist Hex die effektivste Basis, ABER wenn man die komplette Zahl wandel soll, kostet das Zeit!

Also werden nur 19 dezimale Ziffern in eine unsigned int 64-Bit Zahl gewandelt. (also Teil-Blöcke: 19 Ziffern in 8 Byte)

Man kann so blitz schnell mit den vorhandenen Funktionen (printf , atol, usw.) arbeiten und per Modulo und 

http://www.cplusplus.com/reference/cstdio/fseek/

"aus der Mitte" beliebige Ziffern entschlüsseln, ohne jedesmal die komplette Datei anpacken zu müssen!

Diese Art der Komprimierung schafft immer konst. Komprimierung 19:8,

also pro 1 GB in 421 MB -> besser als ZIP, RAW, ... usw, wenn es irrationale Zahlen sind. (Eine 1 mit 1 Mio. Nullen kann natürlich per ZIP besser komprimiert werden, da die vielen gleichartigen Zeichen keine weitere Information benötigen)

Weiterer Vorteil: php kann das auch gut & schnell.

Wenn Du wirklich schnell sein willst, nimm c++ statt c#, da man damit bis zu 20000 mal schneller sein kann als die Interpretersprache, die statt mit der CPU erst mit Microsoft spricht...

unsigned 64bit intege ist das größte

alles andere wäre string.

Marc747 
Fragesteller
 24.04.2017, 17:48

Es geht mir nicht darum die Zahl zu Speichern, sondern kleiner dar zu stellen. So das z.B. aus 12345678901234567890 -> gjA wird [Random Buchstaben]

0
Kiboman  24.04.2017, 17:56
@Marc747

bastel selber was.

von 0-9a-zA-Z (62 zeichen)

kannst du mit 11 stellen (62^11) 64bit integer darstellen

du kannst es dir auch 32 bit umrechnen. dann werden es umso weniger

0
RakonDark  24.04.2017, 17:56

Dann würde ich eine verlustfreie Kompression nehmen

0

Du könntest dich der ASCII Tabelle bedienen und dann z.b. ein 234er System umrechnen.

RakonDark  24.04.2017, 17:52

ups ich meine 224

0
Marc747 
Fragesteller
 24.04.2017, 18:06

Wie kann ich den wirklich große Zahlen mit "char c = (char)n;
Console.WriteLine(c);" Komprimieren?

0