dh-Materialien
JavaScript Programme
 

Berechnen von Kettenbrüchen

x kann als Bruch (Beispiel: 355/113) oder als Dezimalbruch (Beispiel: 3.14) eingegeben werden. Es sind für x auch folgende Werte zulässig: Pi, Phi, e, ln(2), ln(10), sqrt(2). Phi ist hierbei die goldene Zahl und e die Euler’sche Zahl. Die Iterationstiefe N ist maximal gleich 20.

x =
N =


n Kettenbruch Bruch Dezimalbruch


// Berechnen von Kettenbruechen (c)2007 dh

function
Add0(zahlstr) {
// zur formatierten Ausgabe von Dezimalbrüchen
   var input = zahlstr;
   var dot = false;
   var pos = 0;
   for (j = 0; j <= input.length; j++) {
      if (input.charCodeAt(j) == 46) {dot = true; pos = j}
   }
   var st = "";
   if (dot == true) {
      var n0 = 11 - input.length + pos;
      for (j = 1; j <= n0; j++) {st = st + "0"}
   }
   else {
      input = input + ".";
      for (j = 0; j <= input.length; j++) {
         if (input.charCodeAt(j) == 46) pos = j}
      st = "";
      var n0 = 11 - input.length + pos;
      for (j = 1; j <= n0; j++) {st = st + "0"}
   }
   return input + st;
}

// Berechnung von Kettenbrüchen
var x = 0;               // einzugebender Zahlenwert
var n = 1;               // Anzahl der Iterationen
var invR = 0;            // Kehrwert des jeweils verbleibenden Restbruches
var kbf = new Array(20); // Zahlenfolge (xi)
var kb = "<";            // Kettenbruch
var i = 0;               // Laufvariable
var kbz = 0;             // kb = <..;..;..; ..> = kbz/kbn
var kbn = 1;             //
var kbzOLD = 1;          // Hilfsvariable
var kbd = 1.0            // kbd = kbz/kbn

function Calc() {
// berechnet den jeweils nächsten Kettenbruch
// der zu x gehörenden Kettenbruchfolge
   var xIRR = false;
   var fertig = false;
   for (j = 0; j < 20; j++) kbf[i] = 0;
   kb = "<";

// Auswertung der Eingabe für x
   var stg = -5;
   with (document.f_werte.e_x) {
      input = value.toUpperCase();
      if (input == "PI") {
         x = Math.PI;
         xIRR = true
      }
      if (input == "E") {
         x = Math.E;
         xIRR = true
      }
      if ((input == "LN2")||(input == "LN(2)")) {
         x = Math.LN2;
         xIRR = true
      }
      if ((input == "LN10")||(input == "LN(10)")) {
         x = Math.LN10;
         xIRR = true
      }
      if ((input == "SQRT2")||(input == "SQRT(2)")) {
         x = Math.SQRT2;
         xIRR = true
      }
      if (input == "PHI") {
         x = (1+Math.sqrt(5))/2;
         xIRR = true
      }
      if (xIRR == false) {
         var pos = -1;
         var len = value.length;
         stg = -1;

         // zeichenweise Überprüfung der eingegebenen Zeichenkette
         input = "";
         for (j = 0; j < len; j++) {
            cod = value.charCodeAt(j);
            if (cod == 44) cod = 46;
            input = input + String.fromCharCode(cod);
            if ((cod < 48)||(cod > 57)) {
               if ((cod == 46)&&(stg == -1)) {
               // genau ein Dezimalpunkt an der Stelle pos
                  stg = 0;
                  pos = j;
               }
               if ((cod == 47)&&(stg == -1)) {
               // genau ein Schrägstrich an der Stelle pos
                  stg = 1;
                  pos = j;
               }
               if ((stg == 0)&&(pos != j)) {
                  stg = 9;
               } // falsche Eingabe
               if ((stg == 1)&&(pos != j)) {
                  stg = 9;
               } // falsche Eingabe
               if (stg == -1) {
                  stg = 8;
               } // falsche Eingabe
            }
         }
         document.f_werte.e_x.value = input; 

         var szr = ""; // Zähler als Zeichenkette
         var snr = ""; // Nenner als Zeichenkette
         if (stg == -5) {
         // spezielle irrationale Zahl eingegeben
         }
         if (stg == -1) {
         // eingegebene Zeichenkette in der Form "zzzzz"
            szr = input;
            snr = "1";
         }
         if (stg == 0) {
         // eingegebene Zeichenkette in der Form "zzzzz.nnnnn"
            for (j = 0; j < pos; j++) szr = szr + input.charAt(j);
            for (j = pos+1; j < len; j++) szr = szr + input.charAt(j);
            snr = "1";
            for (j = 1; j < len-pos; j++) snr = snr + "0";
         }
         if (stg == 1) {
         // eingegebene Zeichenkette in der Form "zzzzz/nnnnn"
            for (j = 0; j < pos; j++) szr = szr + input.charAt(j);
            for (j = pos+1; j < len; j++) snr = snr + input.charAt(j);
         }
         if (stg > 7) {
         // eingegebene Zeichenkette falsch
            szr = "0";
            snr = "1";
            document.f_werte.e_x.value = 0;
         }

         var zr = 1*szr; // zr = Zähler als Dezimalzahl
         var nr = 1*snr; // nr = Nenner als Dezimalzahl
         var nrOLD = 1;  // Hilfsvariable
         x = zr/nr;
      }
   } 

   // Auswertung der Eingabe für N
   with (document.f_werte.e_N) {
      if (value <= 0) {value = 5};
      if (value > 20) {value = 20};
      n = value;
   }

   // Löschen der alten Tabellenzeilen, falls vorhanden
   j = i;
   while (j > 0) {
      document.getElementById("Tabelle").deleteRow(j);
      j--;
   }

   // Initialisierung
   i = 0;
   invR = x;

   // Hinzufügen einer neuen Tabellenzeile
   while ((i < n)&&(fertig == false)) {
      var row = document.getElementById("Tabelle").insertRow(i+1);

      // i
      var td1 = document.createElement("td");
      td1.style = "text-align:right; border:1px solid #060606";
      var td1Text = i;
      var td1Node = document.createTextNode(td1Text);
      td1.appendChild(td1Node);

      // Berechnung des nächsten Kettenbruchs
      kbf[i] = Math.floor(invR);
      if (i > 0) kb = kb + ";";
      kb = kb + kbf[i];

      var td2 = document.createElement("td");
      td2.style = "text-align:left; border:1px solid #060606";
      var td2Text = kb + ">";
      var td2Node = document.createTextNode(td2Text);
      td2.appendChild(td2Node);

      if (xIRR == false) {
         nrOLD = nr;
         nr = zr - kbf[i]*nr;
         zr = nrOLD;
         if (nr == 0) {fertig = true;}
         else {invR = zr/nr;}
      }
      else {
         if (Math.abs(kbf[i] - invR) <= 0.000000000001) {
            fertig = true;
         }
         else {
            invR = 1/(invR - kbf[i]);
         }
      }

      // Berechnung des zu kbf gehörenden Bruches kbz/kbn
      kbzOLD = 1;
      kbz = 1;
      kbn = 0;
      for (j = i; j >= 0; j--) {
         kbzOLD = kbz;
         kbz = kbz*kbf[j] + kbn;
         kbn = kbzOLD;
      }

      // Bruch
      var td3 = document.createElement("td");
      td3.style = "text-align:right; border:1px solid #060606";
      var td3Text = kbz + "/" + kbn;
      var td3Node = document.createTextNode(td3Text);
      td3.appendChild(td3Node);

      // Berechnung des zu kbf gehörenden Dezimalbruches kbd
      kbd = kbz/kbn;

      // Dezimalbruch
      var td4 = document.createElement("td");
      td4.style = "text-align:right; border:1px solid #060606";
      var td4Text = Add0("" + Math.round(kbd*10000000000)/10000000000);
      var td4Node = document.createTextNode(td4Text);
      td4.appendChild(td4Node);

      row.appendChild(td1);
      row.appendChild(td2);
      row.appendChild(td3);
      row.appendChild(td4);

      i += 1;
   }
}

Kettenbrüche