Zahl in Bruch wandeln (GFA-Basic)

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
Aus: ST-Computer 12 / 1992, Seite 84

Links

Copyright-Bestimmungen: siehe Über diese Seite