Konvertieren von Fließkomma zu 32-Bit-Festkomma in Java

7

Ich muss einen Fließkomma-Punkt in Java in einen 32-Bit-Fixpunkt umwandeln.

Sie können nicht verstehen, was ein 32-Bit-Fixpunkt ist?

Kann irgendein Körper mit Algorithmus helfen?

    
Abhijith V R 04.08.2010, 04:57
quelle

4 Antworten

17

Eine Festkommazahl ist eine Darstellung einer reellen Zahl unter Verwendung einer bestimmten Anzahl von Bits eines Typs für den ganzzahligen Teil und der verbleibenden Bits des Typs für den Bruchteil. Die Anzahl der Bits für jeden Teil ist festgelegt (daher der Name, Fixpunkt). Ein Integer-Typ wird normalerweise zum Speichern von Festkommawerten verwendet.

Festkommazahlen werden normalerweise in Systemen verwendet, die keine Gleitkommaunterstützung haben oder mehr Geschwindigkeit benötigen, als Gleitkommazahlen liefern können. Festkommaberechnungen können mit Integer-Anweisungen der CPU durchgeführt werden.

Eine 32-Bit-Festkommazahl wird in einem 32-Bit-Typ wie int gespeichert.

Normalerweise würde jedes Bit in einem (in diesem Fall vorzeichenlosen) ganzzahligen Typ einen ganzzahligen Wert 2 ^ n wie folgt darstellen:

%Vor%

Aber wenn der Typ verwendet wird, um einen Festkommawert zu speichern, werden die Bits etwas anders interpretiert:

%Vor%

Die Festkommazahl im obigen Beispiel wird als 4.4-Festkommazahl bezeichnet, da es im Integer-Teil 4 Bits und im Bruchteil der Zahl 4 Bits gibt. In einem 32-Bit-Typ würde der Festkommawert typischerweise im 16,16-Format sein, könnte aber auch 24,8, 28,4 oder irgendeine andere Kombination sein.

Die Konvertierung von einem Gleitkommawert in einen Festkommawert umfasst die folgenden Schritte:

  1. Multiplizieren Sie den Float mit 2 ^ (Anzahl der Bruchbits für den Typ), z. 2 ^ 8 für 24.8
  2. Runden Sie das Ergebnis ab (fügen Sie einfach 0.5 hinzu) und unterteilen Sie es (oder in einen Integer-Typ umgewandelt), wobei Sie einen ganzzahligen Wert beibehalten.
  3. Weisen Sie diesen Wert dem Fixpunkttyp zu.

Offensichtlich können Sie im Bruchteil der Zahl etwas Genauigkeit verlieren. Wenn die Genauigkeit des Bruchteils wichtig ist, kann die Wahl des Festkommaformats dies widerspiegeln - z. Verwenden Sie 16.16 oder 8.24 statt 24.8.

Negative Werte können auch auf die gleiche Weise behandelt werden, wenn Ihre Festkommazahl signiert werden muss.

Wenn mein Java stärker wäre, würde ich etwas Code versuchen, aber normalerweise schreibe ich solche Dinge in C, also werde ich keine Java-Version versuchen. Außerdem sieht die Version von stacker für mich gut aus, mit der kleinen Ausnahme, dass sie nicht die Möglichkeit zum Runden bietet. Er zeigt dir sogar, wie man eine Multiplikation durchführt (die Verschiebung ist wichtig!)

    
MatthewD 04.08.2010 13:14
quelle
3

Ein sehr einfaches Beispiel für die Umwandlung in einen festen Punkt, es zeigt, wie man PI um2 konvertiert und multipliziert. Das Ergebnis wird zurück in das Doppelte konvertiert, um zu zeigen, dass die Mantisse während der Berechnung mit Ganzzahlen nicht verloren gegangen ist.

Sie können das leicht mit den Suchtabellen sin () und cos () erweitern. Ich würde empfehlen, wenn Sie Fixpunkt verwenden möchten, um nach einer Java-Fixed-Point-Bibliothek zu suchen.

%Vor%

AUSGABE

%Vor%     
stacker 04.08.2010 06:16
quelle
1

Die Definition eines 32-Bit-Fixpunkts kann variieren. Die allgemeine Idee des Fixpunktes ist, dass Sie eine feste Anzahl von Bits vor und eine andere feste Anzahl von Bits nach dem Dezimalpunkt (oder Binärpunkt) haben. Für eine 32-Bit-Version ist die häufigste Aufteilung wahrscheinlich gerade (16 vorher, 16 nachher), aber je nach Zweck gibt es keine Garantie dafür.

Was die Konvertierung angeht, ist sie auch für einige Variationen offen. Wenn beispielsweise die Eingabezahl außerhalb des Bereichs des Ziels liegt, möchten Sie möglicherweise eine beliebige Anzahl verschiedener Dinge tun (z. B. in einigen Fällen Umbruch) könnte sinnvoll sein, aber in anderen könnte Sättigung bevorzugt werden.)

    
Jerry Coffin 04.08.2010 05:08
quelle
1

Ein Festkommatyp ist einer mit einer festen Anzahl von Dezimal / Binär-Stellen nach dem Basispunkt. Oder allgemeiner ein Typ, der Vielfache von 1 / N für eine positive ganze Zahl N speichern kann.

Intern werden Festkommazahlen als Wert multipliziert mit dem Skalierungsfaktor gespeichert. Zum Beispiel wird 123.45 mit einem Skalierungsfaktor von 100 gespeichert, als ob es die ganze Zahl 12345 wäre.

Um den internen Wert einer Festkommazahl in Gleitkommazahl zu konvertieren, dividieren Sie einfach durch den Skalierungsfaktor. Um den anderen Weg zu konvertieren, multiplizieren Sie mit dem Skalierungsfaktor und runden Sie auf die nächste Ganzzahl.

    
dan04 04.08.2010 05:20
quelle

Tags und Links