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.
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;
}
}
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;
}
}