Problem bei Intervallverschachtelung mit until
Übersicht

![]() |
Dusselchen14Betreff: Problem bei Intervallverschachtelung mit until |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
||
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() |
RallimenSieger des 30-EUR-Wettbewerbs |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke. ich habs jetz einfach mit STR(im#*im#) gemacht^^
Werd wohl ne gute Note absahnen^^ |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group