Das folgende Beispiel zeigt, wie man Dezimalzahlen in Näherungsbrüche verwandelt.
Anwendungen sind z.B. Zahnradpaare oder Kettenblätter, die ein gegebenes Übersetzungsverhältnis möglichst genau mit ganzen Zähnezahlen erreichen sollen.
Das Ergebnis wird auf einer neu erzeugten HTML-Seite ausgegeben.
Syntax
InBruch(DezimalZahl)
DezimalZahl
Dezimalzahl (mit/ohne Dezimalpunkt)
Zusatzfunktionen
Um das Programm klarer zu strukturieren, wurden zwei Funktionsblöcke als eigenständige
Funktionen ausgelagert.
Die erste Funktion markiert in einer Zahl die ersten Ziffern, soweit sie mit einer zweiten
Zahl übereinstimmen. Sinn der Funktion ist es, im Laufe der Näherung die Ziffern der Näherungszahl
kenntlich zu machen, die mit der ursprünglichen Vorgabe schon übereinstimmen.
GleicheZiffernMarkieren(Zahl, VergleichenMit)
Zahl
Dezimalzahl (mit/ohne Dezimalpunkt), deren Ziffern umgefärbt werden sollen
VergleichenMit
Dezimalzahl (mit/ohne Dezimalpunkt), deren Ziffern mit Zahl verglichen werden.
Wenn Ziffern am Anfang von Zahl und VergleichenMit gleich sind,
werden diese Ziffern in Zahl umgefärbt.
GleicheZiffernMarkieren
Rückgabewert. String mit der eingefärbten Darstellung von Zahl.
Wenn die Darstellung von Zahlen schwierig wird, schalten die Browser auf die
Exponentialdarstellung um. Aus 0,0003 wird dann 3e-4. Die folgende Funktion
wandelt solche Zahlen dann in 3·10-4 um.
ExponentialDarstellung(Zahl)
Zahl
Dezimalzahl (mit/ohne Dezimalpunkt)
ExponentialDarstellung
Rückgabewert. String mit der mathematischen Darstellung. Negative Zahlen
haben durch das - am Beginn ein Zeichen mehr, daher wird vor positiven Zahlen ein
Leerzeichen eingefügt.
Anmerkungen
Im Beispielformular wurde die Funktion InZahl() eingesetzt,
damit als Trennzeichen das Dezimalkomma akzeptiert wird. Punkte, die nach dem Komma
liegen, werden als Trennzeichen interpretiert und schneiden die Zahl ab.
Die Ziffern der Näherungen, die mit der eingegebenen Dezimalzahl übereinstimmen,
werden rot gekennzeichnet.
Die Abweichung berechnet sich nach der Formel 100*(Näherung-DezimalZahl)/DezimalZahl
Das Programm findet beispielsweise auch die klassischen Näherungen für Pi
Funktions-Demo
Das folgende Formular demonstriert die Wirkung der Funktion.
Code
<SCRIPT LANGUAGE="JavaScript1.1" TYPE="text/javascript"><!--
// Wandelt Dezimalzahl in Bruch um gibt Ergebnisse als neue Seite aus
function InBruch(DezimalZahl) {
// Variable vorbereiten und vorbelegen
DezimalZahl = Math.abs(DezimalZahl) // Betrag verwenden
var DezimalText = new String(DezimalZahl)
var NeuesFenster = open("","","scrollbars,resizable,menubar")
var Seite = NeuesFenster.document;
var Pos // Position eines Zeichens
var N0 = 0.0, D0 = 1.0
var N1 = 1.0, D1 = 0.0
var N2 = 0.0, D2 = 1.0
var a = Math.floor(DezimalZahl)
var x1 = 1.0; x0 = 1.0
var y = Math.abs(DezimalZahl) - a
// Ausgabe als HTML-Dokument - Schreiben des Dateikopfes
Seite.writeln("<HTML><HEAD>")
Seite.writeln("<TITLE>Zerlegung einer Dezimalzahl in einen Bruch</TITLE>")
// CSS: Styles für die Ausgabe festlegen
Seite.writeln("<STYLE TYPE=\"text/css\">BODY {font-family:verdana,helvetica,sans-serif}")
Seite.writeln("SPAN {font-family:verdana,helvetica,sans-serif;font-size:8pt;color:gray}")
Seite.writeln("TD {font-family:monospace;font-size:9pt}")
Seite.writeln("TH {background-color:cornsilk}</STYLE></HEAD><BODY LINK=GRAY>")
Seite.writeln("Zerlegung einer<H1>Dezimalzahl in einen Bruch</H1>")
Seite.writeln("<TABLE BORDER=1 CELLPADDING=5 CELLSPACING=0>")
Seite.writeln("<CAPTION><B>Näherung für ")
Seite.write (String(DezimalZahl).fontcolor("BROWN"), "</B></CAPTION>")
Seite.write ("<TR><TH>Bruch</TH><TH>Wert</TH>")
Seite.writeln("<TH>Abweichung [%] zu<BR><SMALL>", DezimalZahl, "</SMALL></TH></TR>")
while ((D0 != 0) && (N0/D0 != DezimalZahl)) {
// Mathematischer Algorithmus
N0 = a * N1 + N2
D0 = a * D1 + D2
a = Math.floor(x1/y)
x1 = y
y = x0 - a * y
N2 = N1; N1 = N0;
D2 = D1; D1 = D0;
x0 = x1
// Ergebnisse ausgeben
// Zähler und Nenner ausgeben
Seite.write("<TR><TD><NOBR>", N0, " / ", D0, "</NOBR></TD><TD>")
// Näherung angeben und übereinstimmende Ziffern markieren
Seite.write(GleicheZiffernMarkieren(N0/D0, DezimalZahl), "</TD><TD><NOBR>")
// Abweichung in % berechnen, ausgeben
Seite.writeln(ExponentialDarstellung((N0/D0/DezimalZahl-1)*100), "</NOBR></TD></TR>")
}
// Seite abschließen und ausgeben
Seite.writeln("</TABLE><P><SPAN><B>Autor:</B> ")
Seite.write (" <B>Stand:</B> ", document.lastModified)
Seite.writeln("<BR><B>Pfad:</B> ", document.URL)
Seite.writeln("</SPAN></BODY></HTML>")
NeuesFenster.focus();
Seite.close();
}
// Markiert gleiche Anfangsziffern in Zahlen
function GleicheZiffernMarkieren(Zahl, VergleichenMit) {
Zahl = new String(Zahl)
VergleichenMit = new String(VergleichenMit)
var Anzahl = (Zahl.length < VergleichenMit.length) ? Zahl.length : VergleichenMit.length
for (var Pos = 0; Pos < Anzahl; Pos++) {
if (Zahl.substring(Pos, Pos + 1) != VergleichenMit.substring(Pos, Pos + 1)) { break }
}
if (Pos == 0) { return Zahl } // Keine übereinstimmenden Ziffern
// Anfang der Näherung mit braunen Ziffern versehen
return Zahl.substring(0, Pos).fontcolor("BROWN") + Zahl.substring(Pos)
}
/* Ersetzt 'e' durch '·10', stellt den Exponenten hoch und ergänzt ein
führendes Leerzeichen vor positiven Zahlen */
function ExponentialDarstellung(Zahl) {
// Falls kein Minus vor Abweichung, Leerzeichen voranstellen
Zahl = (Zahl >= 0) ? " " + Zahl : new String(Zahl)
var Pos = Zahl.toLowerCase().indexOf("e")
if (Pos == -1) { return Zahl } // Keine Exponetialzahl
// 'e' durch '×10^' erstezen
return Zahl.substring(0, Pos) + "·10" + Zahl.substring(Pos+1).sup()
} // -->
</SCRIPT>