TI-Basic: Programme und Tutorials: dec⇔bin
Erstellt von: | Peter Riedel |
Schwierigkeitsgrad: | fortgeschritten |
Modell: | Voyage 200 |
Umrechnung von Dezimalzahl in Binärzahl mit Vor- und Nachkommastelle(n)
[Bearbeiten]Folgendes Programm berechnet im ersten Schritt die Nachkommastellen, insofern welche vorhanden sind, und anschließend die Vorkommastellen nach dem Restverfahren. Der Anfang einer Periode wird durch das Tilde ~ angezeigt und endet beim letzten Bit, das noch ausgegeben wird. In der Regel wird das Ergebnis eine Periode enthalten, da nur Nachkommastellen, deren Nachkomma-Vielfaches 1 ist, nichtperiodisch dargestellt werden können. Bei mehr als zwei Nachkommastellen kann die Berechnung sehr lange dauern, weil die benötigte Zeit, bis ein dezimaler Rest das zweite Mal auftaucht und somit das Ende der Periode bestätigt, umso größer wird, je mehr Nachkommastellen vorliegen. Jede weitere Nachkommastelle kann die vorherige maximale Rechenzeit bis um das Zehnfache erhöhen. Problematisch ist, dass der I/O-Bildschirm nicht mehr ausreicht, um diese langen Binärzahlen anzuzeigen. Daher ist es bei so langen Zahlen empfehlenswert, das :Local bin in der vierten Zeile mit © ([F2]+[9] oder [2ND]+[+]+[3]+[M]) auszukommentieren oder zu entfernen. Die String-Variable bin wird dann nach Ende des Programms nicht gelöscht und kann durch Eingabe des Variablennamens im Home vollständig betrachtet werden, indem man horizontal zu den Stellen scrollt, die vorher nicht sichtbar waren. Negative Dezimalzahlen werden im Zweierkomplement dargestellt und das gesetzte Vorzeichenbit wird durch "…" von den restlichen Binärstellen getrennt. Entsprechend der gewünschten Länge des Datenwortes (Anzahl der Binärstellen) muss man selbstständig bei der Umrechnung einer positiven Dezimalzahl, Nullen vor oder nach dem Ergebnis hinzufügen bzw. bei der Umrechnung negativer Dezimalzahlen ins Zweierkomplement "…" zwischen Vorzeichenbit und Ergebnis um die Anzahl der fehlenden Einsen ersetzen.
:dectobin(dec) :Prgm :ClrIO :Local bin,isneg,base :""→bin :setMode("Base","Dec")→base :If dec≥0 Then : false→isneg :Else : true→isneg : dec*(-1)→dec :EndIf :© Nachkommastelle(n) :If mod(dec,1)≠0 Then : Local dual,i,j,k,list,periodic,rest : 2→i : mod(dec,1)→rest : rest→list[1] : Loop : rest*2→dual : bin&string(int(dual))→bin : mod(dual,1)→rest : rest→list[i] : 0→k : For j,1,i,1 : If list[j]=rest Then : k+1→k : If k=1 : j→periodic : EndIf : EndFor : If k=2 Then : ","&left(bin,periodic-1)&"~"&right(bin,j-periodic-1)→bin : Exit : EndIf : If dual=1 Then : ","&bin→bin : Exit : EndIf : i+1→i : EndLoop : int(dec)→dec :EndIf :© Vorkommastelle(n) :Loop : string(mod(dec,2))&bin→bin : int(dec/2)→dec : If dec=0 : Exit :EndLoop :© Zweierkomplement :If isneg Then : Local n,len : dim(bin)→len : For n,1,len,1 : If mid(bin,n,1)="0" Then : bin&"1"→bin : ElseIf mid(bin,n,1)="1" Then : bin&"0"→bin : ElseIf mid(bin,n,1)="," Then : bin&","→bin : Else : bin&"~"→bin : EndIf : EndFor : right(bin,len)→bin : For n,0,len-1,1 : If mid(bin,len-n,1)="0" Then : left(bin,len-n-1)&"1"&right(bin,n)→bin : Exit : ElseIf mid(bin,len-n,1)="1" Then : left(bin,len-n-1)&"0"&right(bin,n)→bin : EndIf : EndFor : "1…"&bin→bin :EndIf :© Ausgabe :Disp bin :setMode("Base",base) :EndPrgm