8 bit float

Tobse

Top Contributor
Hey leute,
ich hab gerade folgendes problem: Ich will viele aber kleine floats in eine datei spcihern. Der Bereich geht von 0,0 bis 10,0, enthält also auch z.B 5,4.
Und da man zahlen bis 10 ja wunderbar in 4 bits reinpassen, wollte ich nicht pro zahl nicht 2 oder mehr bytes benutzen sondern nur einen. Aber da gibts ein problem:
Java:
// Ich hatte das auch schon ohne den string probiert, ging aber nicht.
String a=i+"";
        int dot=a.indexOf(".");
        byte one=(byte) Integer.parseInt(a.substring(0, dot));
        one=(byte) one << 4;
        byte two=(byte) Integer.parseInt(a.substring(dot+1));
        return (byte) one+two;
Angenommen wir aben also z.B. 5,4 ist das Java-Intern [c]0101 0000 0000 0000 0100[/c]. Das dann an dem Punkt gesplittet ergibt one=[c]0000 0101[/c] und two=[c]0000 0100[/code].
Also schieb ich die bits von one 4mal nach links und hab dann [c]0101 0000[/c] und addier dann two drauf und das würde dann [c]0101 0100[/c] ergeben, das was ich will.
Aber die zeilen 5 und 7 ergeben den Fehler "possible loss of precision". So genau kenn ich mich jetzt mit dem bit-shifting nich aus. Kann mir jemand erklären, wie ich das jetzt bewerkstelligen kann, dass aus [c]0101 0000 0000 0000 0100[/c] [c]0101 0100[/c] wird?

Danke schonmal fürs lesen&gedanken machen.
 
one=(byte) one << 4;

Dort wird AFAIR ein byte (one) mit einem int (!) geshiftet, das Ergebnis ist ein int. Mit

one=(byte)(one << 4);

könnte es gehen (ohne deine Intention an sich nachvollzogen zu haben ... klingt gewagt, aber müßte man sich genauer überlegen...)
 
Was der versucht ist eine BCD-Darstellung. Ich würde es aber ehr so machen:
Java:
float f = 5.4f;
int i = f * 10;
byte b = (byte) f; // Enthält dann 54
Umgekehrt dann einfach durch 10.0 teilen und fertig.
 
Hey, stimmt, darauf bin ich noch garnicht gekommen 😉 Danke!
So hats dann geklappt:
Java:
int i=(int) Math.round(f*10f);
byte b=(byte) i;
 
Zuletzt bearbeitet:
Da muss man aufpassen, dass einem nicht die Floating-Point-Rundingsfehler einen Strich durch die Rechnung machen. Sowas wie
1.2 * 10
KANN (muss man sich überlegen) sowas wie 11.999999993131 ergeben (auch wenn das als 12.0 angezeigt wird!)

EDIT: OK, das "round" könnte da schon helfen, aber 100% sicher wäre ich mir da auch nicht ... nur 99.999999991231% 😀 )
 
Da muss man aufpassen, dass einem nicht die Floating-Point-Rundingsfehler einen Strich durch die Rechnung machen. Sowas wie
1.2 * 10
KANN (muss man sich überlegen) sowas wie 11.999999993131 ergeben (auch wenn das als 12.0 angezeigt wird!)

EDIT: OK, das "round" könnte da schon helfen, aber 100% sicher wäre ich mir da auch nicht ... nur 99.999999991231% 😀 )

Wenn das dann in 1% der Fälle schief geht ist das völlig in ordnung. Die werte tauchen nachher in ner GUI auf JSlidern auf, da machen solche minimalen unterschiede nix aus. (also 11.9 oder 12).
 

Neue Themen


Zurück
Oben