Hallo,
Wie kann ich's hinbekommen die Wurtzel einer zahl durch ein basicprogramm auszurechnen?
Danke
Matthias
Druckbare Version
Hallo,
Wie kann ich's hinbekommen die Wurtzel einer zahl durch ein basicprogramm auszurechnen?
Danke
Matthias
hi matthias!
wenn es keinen "sqrt" befehl gibt, dann musst du das selber
programmieren - ist aber nicht schwer.
geht z.b. über das "rechteck"-verfahren:
z.b.: wurzel 10:
10 = 2 * 5 -> a1 = 2, b1 = 5, c = 10
berechnungsschritt:
a2 = a1 + (b1-a1) / 2;
b2 = c / a1;
(im beispiel: a2 = 3.5, b2 = 10 / 3.5 = 2.85;)
du zerlegst deine zahl zu beginn also einfach in zwei faktoren - z.b.
in 2 und die hälfte der ausgangszahl.
dann führst du in einer schleife den berechnungsschritt entweder ein
paar mal aus (so 10 mal reicht in der praxis) oder bis beide zahlen
in etwa gleich gross sind.
klingt kompliziert, funktionert aber sehr gut!!!
(ich hoffe, es gibt in basic keinen sqrt befehl, sonst war das alles für
die katz ;-) )
ciao,
simon
Kompliment, sehr schön beschrieben, falls jemand die Methode einmal testen möchte, ich habe mir eine kleine Excel Datei geschrieben um mir die Wirkungsweise zu verdeutlichen.
Newton Verfahren wurde es wohl auch genannt. Ein Beispiel für ein Interationsverfahren mit quadratisch abnehmenden Fehler.
Wenn man in die gelben Felder die zu berechnende Zahl und den Startwert eingibt, dann kann man an der Kurve verfolgen, wie der Fehler über den Iterationen abnimmt.
Manfred
Keine Sorge, C-Control hat kein SQR-Befehl, allerdings Bascom Basic!
1. man kann auch hoch 0,5 (fuer quadratwurzel) nehmen. soviel ich wies, gibt es beim rechnen mit kommazahlen bie diesem ccontroll-basic probleme und die groese der zahlen ist sehr beschraenkt (ich bin von einem anderen basic das rechnen mit 64bit GLEITKOMMAZAHLEN gewohnt)
2. das rechteck-veerfahren ist nicht sooo toll, weil bei der c-controll ram mangelware ist und dadurch einige (der viel zu wenigen) variablen belegt werden
Müsste es nicht heißen: " b2 = c / a2; " ??Zitat:
berechnungsschritt:
a2 = a1 + (b1-a1) / 2;
b2 = c / a1;
(im beispiel: a2 = 3.5, b2 = 10 / 3.5 = 2.85;)
MfG Kjion
hi!
du hast vollkommen recht.
sonst macht das nicht wirklich sinn ;-)
ciao,
simon
Aus der CCBasic-Hilfe:
Einen ganzzahligen Näherungswert für die Berechnung der Quadratwurzel liefert die Funktion SQR(x).
Was die Kommazahlen angeht: Dafür gibt's in CCCasic, mein' ich, keine fertigen Typen(unter "define" in der Hilfe stehen nur "Bit","Byte" und "Word").
Wenn das so stimmt, man also ohnehin erweitern und Ganzzahlen nehmen muss, ist der SQR-Befehl bestimmt ganz gut.
Wenn man öfter temporäre Variablen braucht, kann man ja welche wiederverwenden, die beim Wurzelziehen gerade keine Information beinhalten(schon schlimm, dass man in CCBasic keine lokale Variablen definieren kann...).Zitat:
2. das rechteck-veerfahren ist nicht sooo toll, weil bei der c-controll ram mangelware ist und dadurch einige (der viel zu wenigen) variablen belegt werden
das problem mit den variablen ist doch nicht wirklich ein problem, oder?
das mit den indizes (a1, b1, b2, b2, .... an, bn) war nur zur verdeutlichung!
programmieren wuerde ich das ganze einfach folgendermassen
function wurzel (var c)
{
a = 2; b = c / 2;
for (var i = 0; i++; i < 10)
{
a = a + (b-a) / 2;
b = c / a;
}
return a;
}
...das ist jetzt zwar kein basic - muesste aber leicht umzusetzen sein!
und man braucht nur vier variablen!
ciao,
simon
Ich sehe das Problem zwar auch nicht so groß, aber eine C-Control hat ganze 24byte Platz für Variablen.Zitat:
das problem mit den variablen ist doch nicht wirklich ein problem, oder?
das mit den indizes (a1, b1, b2, b2, .... an, bn) war nur zur verdeutlichung!
Wenn 64-Bit-Fließkomma ginge, wären mit 2 Variablen schon zwei Drittel davon belegt. Selbst bei Words(entsprechend erweitert) wären das(wenn man sie nicht noch anderweitig verwendet) noch ein Sechstel des verfügbaren Platzes (man bedenke noch das wertvolle Byte für die Zählvariable).
Sinnvoll (also besser als der SQR-Befehl) lässt sich das nur mit Ganzzahlen leider nicht so einfach umsetzen.Zitat:
...das ist jetzt zwar kein basic - muesste aber leicht umzusetzen sein!