← ST-Computer 12 / 1992

Zahl in Bruch wandeln (GFA-Basic)

Programmierpraxis

Immer wenn mein Taschenrechner Zahlenungeheuer wie 0.12345345345345 ausspuckte, verzweifelte ich fast. Zwar ist diese Zahl relativ aussagekrÀftig, ich hÀtte aber lieber einen kurzen (und genauen Bruch), der dieser Zahl exakt entspricht.

Es lĂ€ĂŸt sich auf den ersten Blick vermuten, daß es sich um eine periodische Zahl handelt (Periode 345), doch welchem Bruch entspricht sie? Es ist ja eine mathematische Tatsache, daß sich jede periodische Zahl als Bruch schreiben lĂ€ĂŸt. Die Aufgabe lautet also: 0.12345 = ?

Die Lösung dieser Aufgabe (natĂŒrlich auch beliebiger anderer) ĂŒbernimmt das Programm Zahl->Bruch. Die Verfahrensweise ist relativ einfach und soll anhand der oben genannten Aufgabe demonstriert werden:

x = 0.12345 1000000*x = 12345.345345345345... (100000 = 10^5) - 100*x = 12.345345345345... (100 = 10^2) ------------------------------------- 99900*x = 12333.0 (!) -> x = 12333/99900 = 4111/33300

Der erste Faktor (10^5) berechnet sich aus der LĂ€nge der Periode (3 Stellen) plus der relativen Position der Periode nach dem Dezimalpunkt (2 Stellen). Der zweite Faktor (10^2) berechnet sich aus der relativen Position der Periode nach dem Dezimalpunkt (2 Stellen). Diese beiden Zahlen mĂŒssen dem Algorithmus immer entsprechend angegeben werden. Das Programm kann auch dahingehend erweitert werden, daß es LĂ€nge und Position der Periode selbst erkennt.

Das Ergebnis der Berechnung braucht dann nur noch gekĂŒrzt zu werden (was im Programm fast die meiste Arbeit macht). Die Prozedur liefert dann den Bruch zurĂŒck.

Ein interessantes Beispiel ist der Aufruf der Prozedur mit der Zahl 0.99999999999999... Der Algorithmus liefert als Ergebnis den Bruch 1/1! Daß das Ergebnis völlig korrektest, zeigt dieser kleine Beweis:

1/3 = 0.3333333333333333... 1/3 = 0.3333333333333333... + 1/3 = 0.3333333333333333... ------------------------------- 1 = 0.9999999999999999... !

Das Programm wurde bewußt einfach gehalten, damit es leicht in andere Programmiersprachen portiert werden kann.

' by Andreas Lauterbach fĂŒr ST-Computer ' (c) 1992 MAXON Computer ' beliebige Zahl in Dezimalbruch wandeln in GFA-BASIC 3.0 ' ' Aufruf: zahl_bruch( < Dezimalzahl >, ' < Anzahl der Nachkommastellen vor der Periode >, ' < LĂ€nge der Periode >, ' < Variable fĂŒr ZĂ€hler >, ' < Variable fĂŒr Nenner > ) ' Beispiel: 0.12345: zahl_bruch(0.12345,2,3 , z, n) ' --> z=4111, n=33300 ' CLS INPUT "Dezimalzahl :";zahl INPUT "Wieviel Ziffern zwischen Dezimalpunkt und Periode :";e1% INPUT "LĂ€nge der Periode :";e2% zahl_bruch(zahl,e1%,e2%,zl,nn) PRINT SPACE$(10+LEN(STR$(INT(zahl)))+e1%);STRING$(e2%, "_") PRINT "Die Zahl ";zahl;" entspricht dem Bruch ";zl;"/";nn END ' PROCEDURE zahl_bruch(zahl,anz_vk%,len_per%,VAR zaehler,nenner) IF zahl<0 vz=-1 ELSE vz=1 ENDIF zahl=zahl*vz pot1=10^(anz_vk%) pot2=10^(len_per%+anz_vk%) zaehler=INT(zahl*pot2)-INT(zahl*pot1) nenner=pot2-pot1 u=zaehler v=nenner rest=1 WHILE rest>0 rest=u MOD v u=v v=rest WEND zaehler=(zaehler DIV u)*SGN(vz) nenner=nenner DIV u RETURN
Andreas Lauterbach