 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Neonator-csc
Anmeldungsdatum: 16.11.2005 Beiträge: 2
|
Verfasst am: 16.11.2005, 11:16 Titel: Bei Rechnung nur 7 Ziffern? |
|
|
hallo,
ich habe ein programm geschreiben womit ich eine Intervall schachtelung machen kann [sowas wie quadrat wurzel]:
bsp:
dann zeigt er aber nur
2,828427
aber es würde normalerweise mehr kommen,
da die zahl noch weiter gehen würde..
wie kann ich qbasic sagen das
er mehr als nur [in diesem Fall] 6 dezimalstellen angeben soll?
thx4help |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 16.11.2005, 11:36 Titel: |
|
|
Hallo
Sieh dir z.B. im QB-Kochbuch auf www.qbasic.de mal die verschiedenen Variablentypen an bzw. probiere das hier mal aus:
Code: | z# = SQR(8)
PRINT z# |
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Thomas Antoni

Anmeldungsdatum: 12.10.2004 Beiträge: 220 Wohnort: Erlangen
|
Verfasst am: 16.11.2005, 16:43 Titel: Wurzelberechnung ohne SQR |
|
|
Wie Skilltronic richtig sagt, kannst Du durch Verwendung des Datentyps DOUBLE (64-Bit-Gleitpunktzahl) statt des bei QBasic voreingestellten Typs SINGLE (32-Bit-Gleitpunktzahl) eine wesentlich höhere Rechengenauigkeit mit 17 statt 7 Dezimalstellen erreichen.
Zum Thema "Quadratwurzel ohne den SQR-Befehl berechnen" habe ich mir übrigens Folgendes für die QB-MonsterFAQ vorgemerkt:
--------------------------------------------------------------------------------
Frage deutsch
~~~~~~~~~~~~~~
Frage deutsch
~~~~~~~~~~~~~~
Wie berechne ich Quadratwurzeln ohne SQR und ohne ^(l/2)?
Question English
~~~~~~~~~~~~~~
How to calculate square roots without using SQR and without ^(1/2)?
Antwort 1
~~~~~~~~~
[ von Thomas Antoni, 23.1.2004 ]
Dazu verwendet man ein -> iteratives Näherungsverfahren. Am bekanntesten
ist die Newtonsche Näherung.
Die funktioniert so: Man formt den Ausdruck x = SQR(a) wie folgt in ein "Polynom
2. Grades" um:
a = x^2
-x^2 + a = 0
Jetzt besteht die Aufgabenstellung darin, die Nullstelle x0 dieses Polynoms zu
finden. D.h. Du musst nur rausfinden, wo f(x) = a - x^2 null wird. Das
Newtonsche Näherungsverfahren verwendet hierzu den folgenden -> Algorithmus:
x0 = x0 + ((a - x0*x0)/(2*x0))
Zunächst wählt man einen beliebigen Startwert für x0, z.B. "1". Dann durchläuft
man diese Formel sooft immer wieder, bis die gewünschte Genauigkeit erreicht
ist, z.B. sich die Ergebnisse zweier aufeinanderfolgenden Durchläufe nicht mehr
unterscheiden. Das resultierende Ergebnis x0 ist dann die Wurzel aus a.
In QBasic umgesetzt sieht das dann so aus:
Code: |
'*************************************************
' NEWTON.BAS = Wurzelberechnung nach Newton
' ==========
' Dieses QBasic-Programm berechnet die Quadrat-
' wurzel einer Zahl mit der Newton-Iteration ohne
' Verwendung des SQR-Befehls
'
' (c) Thomas Antoni, 23.1.04
'*************************************************
CLS
INPUT "Gib die Zahl ein: a = ", a#
x# = 1 'Anfangswert fuer die Iteration
DO
y# = x# + ((a# - x# * x#) / (2 * x#))
IF x# = y# THEN EXIT DO 'keine Aenderg. mehr?
x# = y#
LOOP
PRINT "Wurzel aus a = "; x#
PRINT "Tatsaechlicher Wert = "; SQR(a#) 'Kontrolle
|
Antwort 2
~~~~~~~~~~
[ von greenbit ( http://greenbit.ch/ ) im QB-Forum, 23.1.2003 ]
Dafür kann man auch das Heron-Verfahren verwenden. Das ist eine frühe Sonderform
der Newtonschen Näherung.
Das Heron-Verfahren ist uns im 1. Jahrhundert unserer Zeitrechnung durch Heron
von Alexandria als eine Methode zur Bestimmung von Quadratwurzeln hinterlassen
worden. Die Herkunft dieses Verfahren wurde dabei bei den Babyloniern gesehen
und geht sogar wohl noch auf eine ältere sumerische Basis zurück.
Das Verfahren kann so gedeutet werden, dass versucht wird, eine gesuchte Fläche
a mittels eines Rechtecks zu bilden, dessen Seiten man Schritt für Schritt
einander angleicht, bis diese dann idealerweise völlig miteinander in dem
gesuchten Wert x übereinstimmen. Hierzu wird aus einer gegebenen Seite zunächst
die andere aus der angestrebten Fläche durch Division bestimmt, wonach man
einfach zum Mittelwert der beiden Seiten überwechselt.
Beispiel: Berechnung von SQR(2) ~ 1,414215686)
- Es wird der Anfangswert x0 = 1 gewählt
- ausgehend von x0 werden Iterationsschritte durchgeührt. Im n+1-ten
Iterationsschritt wird Folgendes berechnet: xn+1 = (a/xn+xn)/2 .
- zum gesuchten Wert a = 2 entstehen auf diese Weise folgende Werte:
1; 1,5; 1,4166...; 1,414215686...; usw.
- Ist man mit der Genauigkeit zufrieden oder sind zwei aufeianderfolgende
Ergebnisse gleich, so wird abgebrochen
Die Umsetzung des Heron-Verfahrens in QBasic zeigt mein folgendes Programm.
Code: |
'*************************************************
' HERON.BAS = Wurzelberechnung nach Heron
' ==========
' Dieses QBasic-Programm berechnet die Quadrat-
' wurzel einer Zahl mit des Heron-Verfahrens
' ohne Verwendung des SQR-Befehls
'
' (c) greenbit, 23.1.04
'*************************************************
CLS
INPUT "Gib die Zahl ein: a = ", n#
a# = 1
b# = n
DO UNTIL STR$(a#) = STR$(b#)
a# = (a# + b#) / 2#
b# = n# / a#
LOOP
PRINT "Wurzel aus a = "; a#
PRINT "Tatsaechlicher Wert = "; SQR(n#) 'Kontrolle
|
Du wunderst Dich bestimmt darüber, dass ich die Werte a# und b+ für den
Vergleich mit der STR$() - Funktion in Strings umwandle.
Damit hat es folgende Bewandnis: Es ist gar nicht so einfach, herauszufinden, ob
die zwei Zahlen gleich sind. Sie bleiben nämlich bei bestimmten Eingangswerten
auch bei unendlich vielen Iterationen ganz leicht verschieden. Allerdings ist
der Unterschied so klein, dass er nicht einmal die letzte Dezimalstelle
beeinflusst. Dieser Effekt liegt in der Ungenauigkeit der Gleitpunktverarbeitung
begründet. Siehe dazu auch den Eintrag "Warum kommt es bei Gleitpunktoperationen
zu Rundungsfehlern?".
Um hier den Vergleich ein wenig "gutmütiger" zu gestalten, habe ich in meiner
Noit die Werte von a und b über die Funktionen STR$(a) und STR$(b) in Strings
umgewandelt. Diese liefern bereits genau das gleiche Resultat, auch wenn der
numerische Vergleich a = b noch winzige Unterschiede erbringt. Weiß jemand eine
bessere Lösung für dies Problem, als die Gleichheit mit STR$ zu prüfen?
Eine andere Möglichkeit wäre, die Differenz zwischen den beiden Werten auf
einen sehr kleinen Grenzwert abzufragen. Ist der Unterschied kleiner als der
Grenzwert, so sieht man die Zahlen als gleich an:
DO UNTIL ABS(a# - b#) < .0000001
...
Antwort 3
~~~~~~~~~
[ von Wolfgang Lentner, 28.11.2003 ]
Die Dezimalziffern der Wurzel aus 2 lassen sich durch primitives, wenn auch
mühsames Probieren auf viele Stellen genau errechnen. Wir quadrieren einfach
einen Versuch. Ist er zu groß, korrigieren wir den Versuch etwas nach unten, ist
er zu klein, korrigieren wir ihn nach oben bis wir die richtige Ziffer haben.
Das folgende QBasic-Programm demonstriert diese Methode:
Code: |
'*******************************************************************
' WURZELNA.BAS = Wurzelberechnung ueber ein Naeherungsverfahren
' ============
' Die Wurzel aus 2 wird ueber ein einfaches Naeherungsverfahren
' auf viele dutzend Stellen genau berechnet.
'
' Zunaechst definieren wir einen Anfangswert (hier 1.4).
' Diesen quadrieren wir. Ist das Ergebnis zu gross, also ueber 2,
' korrigieren wir den Wert etwas nach unten, ist er zu klein,
' korrigieren wir ihn nach oben. Dieses Spiel wird so lange
' wiederholt bis wir die richtige Ziffer haben.
'
' Die Berechnet geht relativ langsam vonstatten und kann jederzeit
' mit der Esc-Taste abgebrochen werden.
'
' (c) 2002 nach einer Programmidee von Wolfgang Lentner
' wolfganglentner@web.de
' http://wthlentner.cablenet.de/mathematik/rumpf.html
'*******************************************************************
DIM SHARED ziffer(1000), vielfaches(10, 1000), l(10), ergebnis(1000)
DIM SHARED laenge, endlaenge
ziffer(1) = 4
ziffer(2) = 1
laenge = 2
CLS
PRINT "Berechne die Wurzel aus 2 ...Abbruch mit Esc"
DO
IF ziffer(laenge) = 1 THEN
PRINT "NAEHERUNG: 1,";
ELSE
PRINT "NAEHERUNG: 2,";
END IF
FOR s = laenge - 1 TO 1 STEP -1
PRINT LTRIM$(RTRIM$(STR$(ziffer(s))));
NEXT s
PRINT
'
'Vielfache berechnen
FOR i = 1 TO 9
uebertrag = 0
FOR s = 1 TO laenge
e = uebertrag + ziffer(s) * i
vielfaches(i, s) = e MOD 10
uebertrag = e \ 10
NEXT s
IF uebertrag > 0 THEN
vielfaches(i, laenge + 1) = uebertrag
l(i) = laenge + 1
ELSE
l(i) = laenge
END IF
FOR j = l(i) + 1 TO 1000
vielfaches(i, j) = 0
NEXT j
NEXT i
'
'Einerziffer
FOR i = 1 TO l(ziffer(1))
ergebnis(i) = vielfaches(ziffer(1), i)
NEXT i
endlaenge = l(ziffer(1))
FOR j = endlaenge + 1 TO 1000
ergebnis(j) = 0
NEXT j
'
'Restliche zu Ergebnis addieren
FOR s = 2 TO laenge
uebertrag = 0
FOR i = 1 TO l(ziffer(s))
e = ergebnis(s - 1 + i) + vielfaches(ziffer(s), i) + uebertrag
ergebnis(s - 1 + i) = e MOD 10
uebertrag = e \ 10
NEXT i
IF uebertrag = 0 THEN
endlaenge = l(ziffer(s)) + s - 1
ELSE
endlaenge = l(ziffer(s)) + s
ergebnis(l(ziffer(s)) + s) = uebertrag
END IF
NEXT s
'
'Ergebnis ausdrucken
IF ergebnis(endlaenge) = 1 THEN
PRINT "QUADRAT : 1,";
ELSE
PRINT "QUADRAT : 2,";
END IF
FOR s = endlaenge - 1 TO 1 STEP -1
PRINT LTRIM$(RTRIM$(STR$(ergebnis(s))));
NEXT s
PRINT
PRINT
'
'Naechste Naeherung
IF ergebnis(endlaenge) = 1 THEN
IF ziffer(1) < 9 THEN
ziffer(1) = ziffer(1) + 1
ELSE
laenge = laenge + 1
FOR i = laenge TO 2 STEP -1
ziffer(i) = ziffer(i - 1)
NEXT i
ziffer(1) = 0
END IF
ELSE
ziffer(1) = ziffer(1) - 1
laenge = laenge + 1
FOR i = laenge TO 2 STEP -1
ziffer(i) = ziffer(i - 1)
NEXT i
ziffer(1) = 0
END IF
LOOP UNTIL INKEY$ = CHR$(27)
END
|
-------------------------------------------------------------------------------- _________________ +++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++ |
|
Nach oben |
|
 |
jb

Anmeldungsdatum: 14.01.2005 Beiträge: 2010
|
Verfasst am: 16.11.2005, 17:10 Titel: |
|
|
Wenn du nur die ersten 6 Zeichen angezeigt bekommen möchtest, kannst du auf String-Basis arbeiten:
Code: |
DIM wurzel AS DOUBLE
INPUT "Zahl: ", zahl
wurzel = SQR(zahl)
PRINT LEFT$(STR$(wurzel), 6)
END
|
jb |
|
Nach oben |
|
 |
Neonator-csc
Anmeldungsdatum: 16.11.2005 Beiträge: 2
|
Verfasst am: 17.11.2005, 12:58 Titel: |
|
|
oh, danke leute
ich habe natürlich alles im qbkochbuch durchsucht, aber halt mit strg-f
und hab nach "dezimal" gesucht!
und im qbmonsterfaq hab ich auch nichts gefunden...
von beidem kann es aber sein, das meine version von beiden zu alt ist,
denn die monfaq hab ich vor 1 oder 2 jahren geloadet..
und das kochbuch ist mehr als 3-4 jahre alt...
ich hab daheim kein internet(zeitweise), deswegen die antwort erst so spät.. bin gerade in der schule -
aber danke nochmal, werd es auf meinem usb stick specihern und mal versuchen -
allerdings ist meine methode anders als alle die ihr vorgestellt habt,
ich werde sie mal wenn möglich vorführen
mfG Neonator & thx4help
EDIT:
hm konnte das andre nicht ausprobierne, werde es aber noch machen!
das mit der raute funktionierte aber trotzdem habe ich noch zu wenig
Ziffern, um zB SQR( zu berechnen! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|