Gleitkommerzahlen komprimieren

  • Java

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Gleitkommerzahlen komprimieren

    Hallo Leute,
    ich weiß, wir sind hier in einem .net Forum, dies ist jedoch eine reine Logik sache (die bits und bytes sind ja schließlich gleich) und von .net auf java kann ich es selber übersetzten.

    Die Überlegung ist, dass ich sehr viele Gleitkommerzahlen (~10.000.000) (in Java ist die "kleineste" Gleitkommerzahl float mit 32 bit HIER NACHZULESEN) abspeichern muss. Da es auf Android passieren sollte und somit ich nicht wirklich eine Datenbank benutzen möchte, würde ich diese Zahlen, im Format von minimum 0 bis maximal 200 mit max. 2 Nachkommerstellen, in eine Datei speichern. Diese würden jedoch bei 32 bit ca. 40 mb belegen. Es wäre absolut unötig belegter Speicherplatz, da float von +/-1,4E-45 ... +/-3,4E+38 reicht ich jedoch nur eine Zahl bis 200 mit max 2 Nachkommerstellen benötige.

    Meine Überlegung dazu wäre nun einfach, dass ich die bekommene Zahl x 100 rechne und diese als Short (16 bit) abspeichere (1/2 Platz eingespart).

    Doch ich finde die Hälfte ist in diesem Falle trotzdem zu viel. (nicht wegen den 20 mb, sondern aus Prinzip)

    Hat jemand von euch eine bessere Überlegung diese Daten (ohne Verluste) zu speicher?
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%
    Du könntest höchstens 1 bit einsparen, denn:

    Quellcode

    1. ​dec 200 = bin 11001000
    2. dec 99 = bin 1100011

    Somit brauchst du 7 bits, um alle Zahlen für die Vor- und Nachkommastellen abzudecken. Kann man machen, ist aber sehr umständlich zu implementieren...
    Ansonsten: Zippe deine Daten doch einfach, vielleicht kannst du damit noch was reißen.
    @lurker Wie exakt muss die Komprimierung sein (im Sinne von Bild, Audio, Film)?
    • verlustbehaftet, wenn ja, wie viel
    • verlustfrei
    • würde eine ZIP-Datei genügen?
    Wenn ich mir ansehe, wieviel Platz ein mp4-Film gegenüber demselben als mpg gespeicherten Film einspart solltest Du Dich ggf. an ein Mathematiker-Forum wenden, keine Ahnung, ob es so was gibt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    auch interessant wäre wie die Daten aufeinander folgen. Komplett random, oder vlt. doch immer mit einer gewissen maximal differenz?
    Vlt. immer im selben Abstand aber unsortiert?
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @All Das wird wieder mal ein totaler Annahmologie-Thread, @lurker hat sich zu noch gar nix geäußert. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja, insgesamt sind es ja keine Spekulationen sondern Fragen nach Info, die in meinen Augen gerechtfertigt sind.
    Für gleichverteilte "Zufallszahlen" wäre Huffman coding halt die beste Wahl, daher hatte ich das vorgeschlagen. Wenn sich ein Zusammenhang oder eine Eigenschaft der Werte (oder von/zwischen bestimmten Teilen der Wertesequenzen) - was ja idR. der Fall ist - zeigen lässt, kann man anders und sogar weitaus besser komprimieren (Huffman coding lässt sich ja bspw. auch auf vorher komprimierte Werte anwenden).

    Viele Grüße
    ~blaze~
    Hallo Leute,
    es handelt sich hierbei um Strommesswerte, welche von einem sensorlosen Elektromotor stammen. Anhand der phasenbezogenen Last kann man den momentanen Winkel des Motors bestimmen. Es sind immer 3 Werte von einer Messung (die 3 Phasen). Für Analysezwecke würden wir gerne die Daten speichern.

    Also JA, es hängen die Werte zu einen bestimmten Grad zusammen. Man könnte sich vielleicht tatsächlich die Änderung der Werte genauer anschauen und nur diese Speichern. :huh:
    Aber NEIN, die Daten sollten nicht ungenauer werden (auch wenn diese einer Sinuskurve sehr gleichen und eine Näherungsfunktion beinahe möglich währe (Differenz zur Funktion!?)).

    Ich werde mir mal Huffman coding und die Werte genauer anschauen.
    Mit freundlichen Grüßen



    GVI (Teil1/2): 80%

    ~blaze~ schrieb:


    Für gleichverteilte "Zufallszahlen" wäre Huffman coding halt die beste Wahl, daher hatte ich das vorgeschlagen.
    ~blaze~


    Gleichverteilung? Wie soll da bitteschön ein sinnvoller (nützlicher) Huffman-Code entstehen? Die Huffman Codierung basiert doch gerade darauf, dass einige Symbole häufiger sind als die anderen. Wenn alle
    $n$
    Symbole gleich häufig vorkommen, werden im Mittel
    $log_2(n)$
    Bits pro Symbol verwendet. Man kann also gleich ohne Huffman Code nur die 8 Bit pro Symbol (in unserem Fall) benutzen. (Siehe auch hier: de.wikipedia.org/wiki/Huffman-…g#Mittlere_Wortl.C3.A4nge)

    Oder meinst du die 0,4 Bit (
    $\log_2(200) - 8$
    ) die man sich im Mittel spart?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Quadsoft“ ()

    @lurker kannst Du mal einen vernünftig großen ununterbrochenen Datensatz posten?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!