[Tutorial] Nachkomma-Stellen Binär/Hexadezimal

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

[Tutorial] Nachkomma-Stellen Binär/Hexadezimal

Beitrag von Helle »

Tutorial ist vielleicht ein wenig hochgegriffen, aber wer Interesse hat:

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)                       
Gruss
Helle
Benutzeravatar
ChristianK
Beiträge: 77
Registriert: 13.12.2004 14:55

Beitrag von ChristianK »

:mrgreen: wollte grade maulen wegen 3.24; aber passt schon :allright:
ChristianK for President
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

ChristianK hat geschrieben:wegen 3.24
Solche alten Versionen werden noch verwendet? Von wann bist du denn (nicht böse gemeint) :lol:
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Hier noch zwei Procedures zum Konvertieren zwischen Binär und Dezimal mit
Nachkommastellen.
Wie man sieht, werden die dezimalen Zahlen schnell zu periodischen binären
Zahlen.

///Edit:
Code verschoben nach Code, Tipps & Tricks
Antworten