PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wurzel mit C-Control/Basic?



Matthias
05.05.2004, 13:19
Hallo,
Wie kann ich's hinbekommen die Wurtzel einer zahl durch ein basicprogramm auszurechnen?

Danke

Matthias

nestler
05.05.2004, 14:06
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

Manf
05.05.2004, 20:48
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

Frank
05.05.2004, 20:58
Keine Sorge, C-Control hat kein SQR-Befehl, allerdings Bascom Basic!

hrrh
05.05.2004, 21:27
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

Kjion
05.05.2004, 22:26
berechnungsschritt:
a2 = a1 + (b1-a1) / 2;
b2 = c / a1;

(im beispiel: a2 = 3.5, b2 = 10 / 3.5 = 2.85;)

Müsste es nicht heißen: " b2 = c / a2; " ??

MfG Kjion

nestler
06.05.2004, 14:08
hi!

du hast vollkommen recht.
sonst macht das nicht wirklich sinn ;-)

ciao,
simon

Gottfreak
06.05.2004, 15:14
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.


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

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...).

nestler
06.05.2004, 15:33
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

Gottfreak
06.05.2004, 15:57
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!

Ich sehe das Problem zwar auch nicht so groß, aber eine C-Control hat ganze 24byte Platz für Variablen.
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).


...das ist jetzt zwar kein basic - muesste aber leicht umzusetzen sein!

Sinnvoll (also besser als der SQR-Befehl) lässt sich das nur mit Ganzzahlen leider nicht so einfach umsetzen.

nestler
07.05.2004, 12:05
ich behaupte ja gar nicht, dass meine methode besser ist,
als ein sqrt befehl.

aber als näherung - wenn es keinen sqrt-befehl gibt - ist
sie nicht so schlecht. (konvergiert deutlich schneller als
andere, ähnliche verfahren...)

ciao,
simon

Manf
07.05.2004, 15:05
Ich gehe davon aus, daß der Sqrt Befehl mit seinen Operationen nichts besseres machen kann, als genau diesen Algorithmus auszuführen. Nur eben im Hintergrund.
(Bevor es das Nestler-Verfahren genannt wird ("meine methode"), schlage ich Newton-Verfahren vor.)
Manfred

Matthias
08.05.2004, 09:44
Gibt es sqrt in assembler?

Kjion
08.05.2004, 11:16
Nein.

In Assembler von 8-Bit Prozessoren gibt es meist nur addieren und subtrahieren als Rechenarten ( die neueren AVRs können auch multiplizieren und es gibt auch welche die dividieren können, damit hört es aber auf )

MfG Kjion

Matthias
08.05.2004, 14:54
Aso,
Ich probier mal die obrige version aus.

Dankee an allee

Matthias

09.05.2004, 15:49
Nochmal:
In Bascom gibt`s keinen SQRT-Befehl aber einen Befehl namens SQR !
Dieser berechnet die nächste ganzzahlige Näherung der Quadratwurzel.
Macht also, wenn man mit Ganzzahlen arbeitet ("Komma-Typen" kennt das ja nicht.) das gleiche(wie´s intern aussieht, weis ich auch nicht.).

Matthias
09.05.2004, 19:29
Ja das ist schon klar. Wenn man mit nem µC Dividiert, kommen da ja auch (meistens) keine Kommazahlen raus.

nestler
10.05.2004, 14:53
... ok nennen wir es newton verfahren ;-)

ciao,
simon

Matthias
13.05.2004, 17:06
Ich dachte der hat nur die Gravitation erfunden *g*

Ich hab's doch sein lassen. Mein Robby geht vor.