Die letzten 10 Beiträge |
whileLoop |
Habs jetzt anders geschachtelt und schaue da, es stimmt
Vielen Dank nochmal für deine Hilfe!!! |
whileLoop |
Danke für deine Hilfe. Ich geb einfach die erste Iteration aus, dann steht da 1000.
Das Problem ist, dass ich es genau so abgeben muss, dass die gleichen Werte rauskommen. Mit der zusätzlichen Variable stimmts leider auch nicht. Kann ich evtl das If und die whiles irgendwie anders "stapeln", damit evtl ein anderes Fileßkomma-Ergebnis rauskommt?
Das ist die Fehlermeldung, wenn ich es online abgebe:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
>> Input <<
a: 0.11378184001643404, b: 0.09161173587992272
>> Expected output <<
Iterationen: 1000
Rand: 0.34828184001665297
>> Your output <<
Iterationen: 1000
Rand: 0.36555184001667024 |
|
|
eulerscheZahl |
In Zeile 11 muss es heißen if (x*x + y*y <= 4), das ändert aber nichts an der Ausgabe.
Bei a hast du deutlich erkennbare Rundungsprobleme. Die kannst du so ein Stück weit in den Griff kriegen (beachte die Variable f):
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
double a = 0.2; double b = 0.2;
double x = 0; double y = 0;
int n = 0; double f = 0;
while (x*x+y*y <= 4) {
while (x*x+y*y <= 4 && n < 1000) {
double xtemp = x*x-y*y+a;
double ytemp = 2*x*y+b;
x = xtemp;
y = ytemp;
n++;
}
if (x*x+y*y <= 4) {
x = 0;
y = 0;
a = 0.2 + (++f * 0.0001);
n = 0;
}
} |
|
Der Schleifenzähler ist aber immer noch bei 445 statt bei 1000. |
whileLoop |
Leider bin ich doch noch nicht ganz fertig, meine Aufgabe hat sich erweitert:
Erhöhen Sie danach den Wert a schrittweise um 0.00001, bis die Anzahl der Iterationen kleiner als 1000 wird. Geben Sie dann a aus. Falls die Iterationen vorher schon unter 1000 waren, bleibt a unverändert.
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
|
while (x*x+y*y <= 4) {
while (x*x+y*y <= 4 && n < 1000) {
xtemp = x*x-y*y+a;
ytemp = 2*x*y+b;
x = xtemp;
y = ytemp;
n++;
}
if (n == 1000) {
x = 0;
y = 0;
a = a+0.00001;
n = 0;
}
} |
|
Die Ausgabe sollte so ausschauen:
code: |
1:
2:
3:
4:
5:
6:
|
a:
0.2
b:
0.2
Iterationen: 1000
Rand: 0.3757 |
|
Meine sieht so aus:
code: |
1:
2:
3:
4:
5:
6:
|
a:
0.2
b:
0.2
Iterationen: 445
Rand: 0.3757000000001757 |
|
Steck jetzt schon ne ganze Weile, ich hatte auch schon die Ausgabe Iterationen: 1000 - Rand: 0.39323000000019326
Aber das ist ebenfalls nicht richtig.
Hast du eine Idee eulerscheZahl? |
whileLoop |
ja klar.
Danke eulerscheZahl
|
eulerscheZahl |
code: |
1:
|
while (x*x+y*y <= 4 && n < 1000) |
|
1. muss es <= 4 heißen, da nur bei > 4 gestoppt werden soll.
2. kommt ein UND zwischen die Bedingungen.
Dann kommt auch eine 9 raus. |
whileLoop |
Hey danke, mein Code schaut so aus:
code: |
1:
2:
3:
4:
5:
6:
7:
8:
|
while (x*x+y*y < 4 || n < 1000) {
xtemp = x*x-y*y+a;
ytemp = 2*x*y+b;
x = xtemp;
y = ytemp;
n = n+1;
} |
|
Und am Anfang alles Null gesetzt, double Variablen gegeben, etc. Trotzdem wird der falsche Output geliefert, für a=0.4 b=0.4 sollen 9 Interationen rauskommen. |
eulerscheZahl |
code: |
1:
2:
3:
4:
5:
6:
7:
|
x=0; y=0;
while (...) {
x_temp = ...
y_temp = ...
x = x_temp;
y = y_temp;
} |
|
|
whileLoop |
Okay danke erstmal für deine Hilfe, also wenn ich das jetzt richtig verstanden habe, gebe ich x und y vorerst den Wert 0 und speichere sie dann unter einer Hilfsvariable ab. Okay, aber wie setzt sich die Formel zusammen x = x_temp * x_temp - y_temp * y_temp + a ??
LG |
eulerscheZahl |
Variablen initialisieren: a,b einlesen, x,y,Schleifenzähler zu 0 setzen.
In der Schleife: x_temp und y_temp berechnen (sonst würdest du ja eine Variable überschreiben, von der du noch den alten Wert brauchst). Die Ergebnisse dann dem x und y zuweisen. Schleifenaustrittsbedingungen prüfen, fertig. |
Es sind weitere Beiträge zu diesem Thema vorhanden. Klicken Sie hier, um sich alle Beiträge anzusehen. |