Problem bei Intervallverschachtelung mit until

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Dusselchen14

Betreff: Problem bei Intervallverschachtelung mit until

BeitragDo, Sep 10, 2009 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Wir haben in Mathe grad Intervallverschachtelung und dazu hab ich dieses kleine proggi geschrieben:
Code: [AUSKLAPPEN]
x#=wurzel(Input())
Print x#
WaitKey


Function wurzel(z#)

u#=1
o#=z#
im#=z/2

Repeat



If im#*im# > z# Then o#=im#

If im#*im# < z# Then u#=im#

Im#=(u#+o#)/2

Print "-----------"
Print im#*im#

Print z#+"<--"
Print "Wurzel: "+u#
Print "-----------"
Delay 200
Until im#*im#=z#
Return im#
End Function


Funktioniert eigentlich alles Super aber manchmal (z.b. bei Wurzel aus 133) wird die schleife nicht verlassen. obwohl im#*im#=z# zutrifft. (wie die prints beweisen) warum? bei 9 funktionierts.

im# ist die Intervallmitte
u# die untere Grenze
und o# die obere
Danke schonmal!

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Sep 10, 2009 17:34
Antworten mit Zitat
Benutzer-Profile anzeigen
das Problem liegt an BB
denn BB rechnet intern mit Binärzahlen weiter und da gibt es dann Probleme!

hier mal ein schönes Beispiel
Code: [AUSKLAPPEN]
For t#= 7 To 10 Step 0.1
   Print T
Next
WaitKey
[BB2D | BB3D | BB+]

Noobody

BeitragDo, Sep 10, 2009 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Floats sind ungenau, daher kann ein direkter Vergleich mit = Probleme geben. Du kannst versuchen, die drittletzte Zeile abzuändern in: Code: [AUSKLAPPEN]
Until Int( im#*im# )= Int( z# )


Dann bricht er ab, wenn die beiden Zahlen ungefähr gleich sind. Um höhere Genauigkeit zu erreichen, kannst du die beiden Zahlen vor dem Umwandeln mit 10 (100, 1000....) multiplizieren, dann kannst du mehr Nachkommastellen 'retten'. Code: [AUSKLAPPEN]
Until Int( im#*im#*100 )= Int( z#*100 )

Allerdings musst du auch hier aufpassen, dass du die letzten beiden Kommastellen nicht mitnimmst, da diese bei Floats manchmal Fehlerwerte enthalten.

Ausserdem solltest du deine Funktion als Float deklarieren, damit du ein besseres Resultat bekommst Wink Code: [AUSKLAPPEN]
Function wurzel#(z#)
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Rallimen

Sieger des 30-EUR-Wettbewerbs

BeitragDo, Sep 10, 2009 17:55
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde es in diesem Fall mit
Code: [AUSKLAPPEN]
If im#*im#=z# Then Return im#
Until u#=im# Or im#=o#


in der letzten Zeile wird abgebrochen wenn (u+o)/2 keinen Mittelwert berechnen kann!
[BB2D | BB3D | BB+]

Dusselchen14

BeitragFr, Sep 11, 2009 9:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke. ich habs jetz einfach mit STR(im#*im#) gemacht^^
Werd wohl ne gute Note absahnen^^

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group