Code: Alles auswählen
;- "Helle" Klaus Helbing, 28.05.2007
;Nachkomma-Stellen Binär/Hexadezimal
;===================================
;Steht man z.B. vor der Aufgabe, eine Dezimal-Zahl mit Nachkomma-Stellen, für die z.B. aus
;Genauigkeits-Gründen nicht das Fliesskomma-Format verwendet wird, in das Binäre- oder
;Hexadezimale-Zahlenformat umwandeln zu müssen, sind PB ebenso wie normale (Taschen-)
;Rechner dazu nicht in der Lage. Nachfolgend einige Hilfen und Anregungen, um das Problem
;zu lösen.
;Allgemeines: Hat man z.B. die "normale" Dezimal-Zahl "12.12", ist die Umwandlung des
;Vorkomma-Anteils in eine hexadezimale Zahl kein Problem: "12" ist "$0C" wie bei einer
;Ganz-Zahl auch. Alles kein Problem. Wer nun aber denkt, den Nachkomma-Anteil schreibe
;ich eben auch als "$0C", also insgesamt mit Komma dann "$0C.0C", liegt falsch! Das
;dezimale Ergebnis (in der Rückrechnung) ist nämlich "12.046875"! Wie kommt das? Weil
;man für Nachkomma-Stellen mit negativen Exponenten zur binären Basis arbeiten muss!
;Da die Hexadezimal-Zahlen "nur" eine verkürzte Darstellung der Binär-Zahlen sind und
;jede Berechnung vom Computer sowieso binär ausgeführt wird, beziehen sich nachfolgende
;Erläuterungen auf binärer Betrachtungsweise; die Umrechnung von Binär in Hexadezimal
;erfolgt wie üblich.
;Wichtig ist zu wissen: Der Wert einer Binär-Zahl ist die Summe der Werte der gesetzten
;Bits. Beispiel: Die Binärzahl sei "10.011b". Der Vorkomma-Wert ist schnell klar: Die Null
;steht für 0x2^0 (also Null) und die Eins steht für 1x2^1 (also Zwei), der Dezimal-Wert
;ist also 0+2=2. Die Ziffer vor dem x (Multiplikator) zeigt an, ob dieses Bit gesetzt (1)
;ist oder nicht (0), die Ziffer nach dem ^ (Exponential) ist die Wertigkeit des jeweiligen
;Bits (Bit0 hat Wertigkeit 1, Bit1=2, Bit2=4 usw.). Die Basis ist natürlich immer die Zwei.
;Und die Nachkomma-Stellen? Werden prinzipiell genauso berechnet! Nur haben die Nachkomma-
;Stellen jetzt folgende Wertigkeiten: Die Stelle direkt nach dem Komma hat den Exponenten
;-1 zur Basis 2, also 2^-1=0.5. Wäre dieses Bit gesetzt, müsste zum Wert (bisher 2) also
;0.5 addiert werden. Das nächste Bit hat dann die Wertigkeit 2^-2=0.25, dann folgt
;2^-3=0.125 usw. Da im Beispiel das zweite und dritte Nachkomma-Bit gesetzt sind, lautet
;also das dezimale Ergebnis von 10.011b:
; 2 1x2^1
; + 0 0x2^0
; + 0.0 0x2^-1
; + 0.25 1x2^-2
; + 0.125 1x2^-3
; -------
; = 2.375
; =====
;Die Umrechnung des binären "10.011b" in hexadezimal ist simpel: Vorkomma=2 und der Nach-
;komma-Anteil muss (mindestens) auf Byte-Grösse gebracht werden: 011 wird zum Byte
;01100000, also $60. Die Nullen werden rechts angehängt; sie haben keine weiteren
;Werte (weil ja Null). Damit lautet der hexadezimale Wert dann $2.60.
;Wichtig ist, die Nullen vor der ersten (binären) Eins nicht einfach unter den Tisch
;fallen zu lassen, denn sie besetzen ja jeweils eine Stelle im Reigen der Zweier-
;Potenzen!
;Die Umrechnung von Dezimal- in Binär-Nachkomma-Stellen erfolgt durch Vergleiche der
;jeweiligen Werte: Ist der (verbleibende) Dezimalwert grösser als die jeweilige Zweier-
;Potenz, wird im Ergebnis das entsprechende Bit gesetzt, ansonsten bleibt es ungesetzt.
;Als konkretes Beispiel hier der Beginn der Umrechnung der dezimalen Nachkomma-Stellen
;von Pi (1415926535...) in das binäre Format ("0." der Werte wird weggelassen). Die
;Länge des jeweiligen Wertes entspricht der Stelle, also alle Werte fangen mit Länge 1
;an. Die Vergleiche werden als Subtraktion ausgeführt, da die Differenz evtl. sowieso
;benötigt wird (dezimaler Wert ist der umzuwandelnde Dezimal-Wert):
;=========================================================================================
;Stelle binäre Wertigkeit (2^-Stelle) dezimaler Wert Vergleich Ergebnis-Bit
;-----------------------------------------------------------------------------------------
; 1 5 1 1-5 0
; 2 25 14 14-25 0
; 3 125 141 141-125 1
; Hier war der dezimale Wert grösser, also wird das entsprechende Ergebnis-Bit gesetzt und
; der dezimale Wert muss angepasst werden: 141-125=016. Im dezimalen Ausgangswert werden
; die 141 durch 016 (Stellenanzahl beachten!) ersetzt, so das dort nicht mehr 1415926...
; steht, sondern 0165926... In Schritt 4 wird also 0165 eingelesen.
; 4 0625 0165 0165-0625 0
; 5 03125 01659 01659-03125 0
; 6 015625 016592 016592-015625 1
; Wie nach Schritt 3 beschrieben wird das entsprechende Ergebnis-Bit gesetzt. Der neue
; dezimale Vergleichswert beträgt: 016592-015625=000967; dieser Wert ersetzt jetzt die
; ersten 6 Stellen des dezimalen Wertes: Aus 016592 wird 000967.
; 7 0078125 0009676 0009676-0078125 0
; 8 00390625 00096765 00096765-00390625 0
;=========================================================================================
;Die ersten 8 Bits sind ermittelt: 00100100b, was hexadezimal $24 entspricht. Pi(Hex) fängt
;also an: $3.24.
;Alles klar?! (Code-Beispiele siehe: http://www.purebasic.fr/german/viewtopic.php?t=7896)
Helle