C Berechnung von Pi

datalukas

Captain
Registriert
Dez. 2009
Beiträge
3.627
Hallo liebe CBler,

ich hab mal wieder ein Problem. Und zwar solll das Programm Pi nach dem Leibnizverfahren berechnen.

http://de.wikipedia.org/wiki/Leibniz-Reihe

Code:
 #include "stdafx.h"


int main(void) {
	int genauigkeit, vorgang, x, y;
	long double zahl, pi;
	x = 1;
	zahl = 0;
	printf("\t Pi-Berechnung \n");
	printf("Wie viele Durchläufe?\n");
	scanf("%i", &genauigkeit);
	for (vorgang = 1; vorgang <= genauigkeit; vorgang++) {
		zahl = zahl + 1/x - 1/(x + 2);
		x = x + 4;
	}
	pi = zahl * 4;
	printf ("Wert von PI: %llf \n", pi);
	scanf("%i", &y);
	return 0;
}

Das scanf in der vorletzten Zeile könnt ihr ignorieren, es dient nur dazu, dass man das Fenster noch sieht.

X ist die Zahl im Zähler des Bruchs. Zahl ist einfach das Viertel von Pi.

Das Problem ist, dass, egal wie viele Durchgänge ich wähle, immer 4 herauskommt.

Gruß
Datalukas
 
mach mal ein den hier:

PHP:
for (int i = 1; i <= genauigkeit; i++)
	{
		zahl += pow(-1.0L, i+1) / (2*i-1);
	}
	pi = zahl * 4.0;
 
Zuletzt bearbeitet:
x ist integer, du hast aber eine Berechnung 1 / x. Da wird sogut wie immer 0 oder 1 rauskommen weil eben x ein integer ist und damit das Resultat einer Berechnung damit auch ein integer und kein double.

Um solche Dinge zu debuggen solltest du bei der Berechnung in der Schleife am Ende eine Ausgabe der wichtigen Variablen der Rechnung machen. Dann siehst du sofort wie und wann es schiefläuft.
 
Abgesehen von den richtigen Kommentaren hier, dass du eine Long Double mit einem Integer berechnest, kannst du doch die Reihe exakt in der gleichen Form wie bei Wiki mit der Laufvariablen der Schleife realisieren.

Code:
for(int i = 0; i < Genauigkeit; i++){
[INDENT]Zahl = Zahl + (Math.Pow(-1, i)/(2*i+1))[/INDENT]
}

Ungefähr in dieser Form, ich weiß jetzt nicht, ob das wirklich klappt, wegen den Vorzeichen und sowas, müsste man gucken, aber vom Prinzip her als Denkanstoß sollte das so klappen.
 
Zuletzt bearbeitet:
Mumpitzelchen schrieb:
x ist integer, du hast aber eine Berechnung 1 / x. Da wird sogut wie immer 0 oder 1 rauskommen weil eben x ein integer ist und damit das Resultat einer Berechnung damit auch ein integer und kein double.

Es kommt aber auf den linken Wert an. Das heißt: 1.0F/x würde klappen, auch wenn x ein int ist.
Ergänzung ()

bzw.
1.0D
Ergänzung ()

bzw. sogar nur
1.0
 
@F_GXdx: Es kommt auf beide an, also linke und rechte Seite. Aber deine Version sehe ich auch als naheliegender an.
 
1668mib schrieb:
@F_GXdx: Es kommt auf beide an, also linke und rechte Seite.

Nein. Sobald an einer Rechnung eine Gleitkommatyp beteiligt ist, werden alle Operanden zu gleichrangigen Gleitkommatypen "promotet" (befördert), und auch das Ergebnis der Operation ist dann ein entsprechender Gleitkommatyp.

(Selbstverständlich muß das Ergebnis auch einem entsprechenden Gleitkommatyp zugewiesen werden.)
 
Vielen Dank. Am einfachsten ist es einfach x auch als long double zu definieren.

Eine Frage habe ich noch:
Was muss ich machen, damit mir mehr als sechs Nachkommastellen angezeigt werden?
 
Nein, am einfachsten ist das, was ich geschrieben habe, denn du musst nur 2x 2 Zeichen hinzufügen. :D
 
@antred: Entschuldigung, hatte mich etwas unklar ausgedrückt. Du hast natürlich recht.
Mit "beide Seiten" meinte ich, was du sagtest, dass beide Seiten berücksichtigt werden und eben nicht nur die linke. Aber danke für die Klarstellung, ich ärgere mich im Nachhinein selbst über meine unklare Aussage.
 
Hallo. Ich hatte bei zahl = zahl + 1.0F/x - 1/(x + 2); das ".0F" dazu gemacht und es berechnet mir alles nur größere Zahlen. Die kleinste zahl wahr bei der eingabe 1 die 4 und dann nur größer. was kann cih ändern damit es mir PI ausrechnet?
 
Es muss natürlich jede Division von 2 Integern entsprechend angepasst werden. Dann kommt auch das richtige heraus.
 
Zurück
Oben