Fehler in Schleife?
-
Ich habe folgenden Code
for (i = 1; i < g; i++) { summe = summe + 1/(i * i); } summe = summe * 6; summe = sqrt(summe); m_Ausgabe1 = summe; UpdateData(FALSE);Das ist eine Formel zur Berechnung von Pi. Dabei wird eine Reihe der Form 1/n^2 gebildet und n läuft gegen unendlich. Wenn ich denn das Ergebniss durch 6 Teile und die Wurzel ziehe, sollte eigentlich Pi herauskommen. Aber schon ab g > 4 gibt er immer die selbe Zahl aus. Die Zahl 2.44948974278318.
Wer weiß Rat??
MFG
-
wo legst du denn den typen von i fest?
wäre gut waas darüber zu wissen
-
i und g hab ich vorher als int deklariert und g ist die Grenze die vom Benutzer eingegeben wird. Variable summe hab ich als double deklariert. Geschieht alles vor der Schleife.
UpdateData(TRUE); int g = m_Grenze; int i; double summe;
-
hast du summe den wert 0 zugewiesen, bevor du anfängst mit der variable zu rechnen

-
2.44948974278318 = sqrt(6)
Mach 1/i*i zu einem double, dann geht das auch.Jockel
-
Habs jetzt gemacht. Ändert aber leider nix an meine Prob. Ist noch genauso wie vorher.
-
Ich hab dich 1/ii zu einem double gemacht.
Heißt ja summe = 1/(ii);
Dabei ist ja summe ein double
-
Desert Storm schrieb:
Habs jetzt gemacht. Ändert aber leider nix an meine Prob. Ist noch genauso wie vorher.
Jockelx meinte dies
1.0 / (i * i)Jetzt ist 1.0 eine Gleitpunktzahl.
-
Das weiss dein Kompiler aber zu dem Zeitpunkt leider nicht, was du willst.
Also mach summe + ((double)(1/(i * i))
-
Oder mach es schöner, so wie finix

-
1/(i*i) sollte bei allen i>1 0 ergeben. Bei diser Operation sind nur ints beteiligt, also führt der Compiler auch eine int-Division aus. Du solltest i schon in einen double umwandeln.
1.0/(double(i)*i) sollte schon reichen.
[/edit]Zu spät und bei genaueren Hinsehen reicht Finix Variant auch[edit]
-
Jockelx schrieb:
Also mach summe + ((double)(1/(i * i))
Nutzt auch noch nichts, da der Compiler zuerst die Klammer berechnet und das (Integer-)Ergebnis dann nach double castet.
(1.0 / ((double)i * i)) wäre ok.
@Braunstein: Und warum erzeugst Du ein temporary statt zu casten?

-
Hier wird eigentlich kein temporäres Objekt erzeugt. Das ist AFAIK eine funktionale explizite Typkonvertierung. (Standard 5.2.3 1 oder so?)