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.
 

Marco13

Top Contributor
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...)
 

HoaX

Top Contributor
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.
 

Tobse

Top Contributor
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:

Marco13

Top Contributor
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% :D )
 

Tobse

Top Contributor
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% :D )

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).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Arif Datentypen Float-Rundungsfehler Allgemeine Java-Themen 5
H float Berechnung: Ergebnis ohne wissenschaftliche Notation Allgemeine Java-Themen 5
RalleYTN float in WORD konvertieren Allgemeine Java-Themen 1
N OctetString --> Float Allgemeine Java-Themen 5
P Wird double und float auf jedem Computer gleich berechnet? Allgemeine Java-Themen 10
J Datentypen String in Float umwandeln und "umbauen"? Allgemeine Java-Themen 5
M float, double, BigDecimal Allgemeine Java-Themen 5
S Variablen Prüfen ob Number vom Typ Integer, Float, Double, ... ist Allgemeine Java-Themen 2
N Variablen Gleitkommazahlen - Kleineres float? Allgemeine Java-Themen 11
P Datentypen float mit komma statt punkt möglich? Allgemeine Java-Themen 6
S Type mismatch: cannot convert from Object to float Allgemeine Java-Themen 3
B Variablen Bug of Float. & Double.MIN_VALUE! Allgemeine Java-Themen 4
M FIFO Queue: bytes in, float/double/etc out Allgemeine Java-Themen 5
vandread Float/Double probleme bei der Multiplikation?! Allgemeine Java-Themen 3
F Float Division - Nachkommastelle bei 0 ausblenden Allgemeine Java-Themen 2
Developer_X "String" in "int" umwandeln, und dann "int" in "float" Allgemeine Java-Themen 8
G String nach Float parsen Allgemeine Java-Themen 2
E hex- Stirng in einen float umwandeln Allgemeine Java-Themen 9
MQue Float- Wert formatieren Allgemeine Java-Themen 8
E int vs. float vs. double Allgemeine Java-Themen 7
spacegaier Kommastellen aus float extrahieren Allgemeine Java-Themen 13
G WAV-Samples bearbeiten oder: 2 Bytes -> short -> float Allgemeine Java-Themen 5
J Float Formatierung? Allgemeine Java-Themen 6
P string zu float - darstellungsproblem Allgemeine Java-Themen 4
G Verständnisproblem double und float Allgemeine Java-Themen 7
W Division mit float und double Allgemeine Java-Themen 2
B Umwandeln von Bytes in float Zahl (DataInputStream) Allgemeine Java-Themen 3
W float/double verhält sich seltsam Allgemeine Java-Themen 6
R Float richtig in Integer ? Allgemeine Java-Themen 4
N Float zahl auf eine Stelle nach dem Komma runden Allgemeine Java-Themen 3
A Float-Wert auf 2 Stellen nach den Komma runden ? Allgemeine Java-Themen 2
H Multiplikation int*float Allgemeine Java-Themen 2
V Typumwandlung Integer, Float etc in String Allgemeine Java-Themen 4
S Rechnen mit float Zahlen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben