Algorithmische codierung

bluer

Aktives Mitglied
muss für die uni einen algorithmischen en/decoder schreiben. soweit so gut.
bin auch schon eigentlich fertig mein einziges problem ist jetzt wie ich einen double wert von bsp. 0.62 mit 9 bit speichern kannu nd nicht die vollen 64 brauche? wenn ich es zu einer binärzahl umwandel bekommen ich immer eine scheinbar endlose folge von 0 und 1, da er halt 0.620000000000000000 umwandelt. hat einer ne ahnung wie ich das abschneiden kann?

danke
 
S

SlaterB

Gast
schneid doch wo du willst, wo besteht da die Frage?

interessant ist aber, dass 0.62 in Binär bestimmt so eine unendliche Darstellung hat wie 1/3 im Dezimalsystem = 0.3333333...

nur 0.5, 0.25, 0.125 usw. sowie vielfache und Kombinationen davon lassen sich mit Bits genau darstellen
 

bluer

Aktives Mitglied
ziel der arithmetischen kodierung ist die komprimierung von dateien. dabei wird jeden zeichen ein bestimmtes intervall zwischen 0 und 1 zugeordnet. Z.B. Hallo, h bekommt 0-0.2, a bekommt 0.2-0.4, l bekommt 0.4-0.8, h bekommt 0.8-1.0. bei mehr zeichen wird das halt dementsprechend komplizierter. nun werden die worte mit einem bestimmten algorithmus als double zahl errechnet. bei hallo wäre es 0,525390625. aber da die speicherung dieser dublezahl 64 bit benötigen würde würde man ja nichts komprimieren. demzufolge wird bei 0,525 abgeschnitten und dies auf 9 bit gespeichert. meine frage ist nun wie ich 0,525 auf 9 bit anstelle von 64 bit gespeichert bekomme? Beziehungsweise, ob es in java eine methode gibt, die mit aus 0,525 -> 0,100001101 macht? und nicht 0,1000011010000000000000...usw.
 
S

SlaterB

Gast
> ob es in java eine methode gibt, die mit aus 0,525 -> 0,100001101 macht? und nicht 0,1000011010000000000000...usw.

hast du denn eine Methode, die letzteres zurückgibt? glaube eher nicht dass es das gibt und mit dem rundenden double mit interner Exponentendarstellung würde ich gar nicht erst was anfangen,


dann schreibe dir lieber eine Methode, die selber die Bits ausrechnet,
erstes Bit ist 1 wenn 0.5 drin ist sonst 0 usw.
da kannst du gleich die Anzahl Bits übergeben, bekommst genau das Rückgabeformat für die Bits wie du es benötigst (Array, String, ..)
und was immer noch zu wünschen ist
 

bluer

Aktives Mitglied
also habe jetzt einfach selber ne funktion geschrieben und auf die einspechende geanuigkeit geachtet. bekomme zwar nur ne kompression von 97% aber besser als gar nichts...
 

Wildcard

Top Contributor
Mit Double zu rechnen scheint mir hier grundfalsch wegen der Ungenauigkeit einer IEEE Zahl.
Du solltest wohl eher ein BitSet oder ähnliches verwenden, sonst kannst du dein komprimiertes Zeug später nicht mehr laden...
 

bluer

Aktives Mitglied
ja habe jetzt auch mit bitset gearbeitet. ich schneide einfach die double zahl maximal möglich ab und wandel die das in eine binärzahl zur basis 0.5 und anschließend schreibe ich alle diese binärzahlen in ein bitset, welches ich dann in ein bytearray packe.
 

Ähnliche Java Themen

Neue Themen


Oben