Master Z Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Hi Leute hab da mal wieder ein kleines Problemm mit C!*g* Wollte ein Programm schreiben das mir Pi berechnet! Nach dieser Formel! pi=(1-1/3+1/5-1/7+1/9-1/11+1/13-............)*4 Der Benutzer soll auch eingeben wie weit und wie genau er pi berechnen möchte!Wenn er z.B 7 eingibt ist die Berechnung genauer als wenn er 3 eingibt! Die Berechnung hab in eine .h ausgelagert und in der .c übergebe ich nur die Zahl und gebe das Ergebnis aus! Mein Funktion sieht so aus! -------------------------------------------------------------------------------------------------------- float pi(float zahl) { int i,merker=0; float pi=1; for(i=3;i<=zahl;i=i+2) { if(merker==0) { pi=pi-(1/i); merker=1; } else { pi=pi+1/i; merker=0; } } return pi; } -------------------------------------------------------------------------------------------------------- Als Ergebnis bringt er mir Pi = 4; Warum?Kann doch eigentlich nicht so schwer sein!Hab schon schwerere Progs geschrieben ich will aber heute irgendwie nicht drauf kommen!*Auch brett vor dem Kopf* Zitieren
Klotzkopp Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Wenn du 1/i rechnest, macht der Compiler eine Ganzzahldivision, weil Zähler und Nenner beide ganzzahlig sind (i ist ein int, das Stringliteral 1 auch). Dabei werden Nachkommastellen abgeschnitten. Damit kommt (für i > 1) immer Null raus. Wenn du eine Fließkommadivision willst, muss einer der Operanden ein Fließkommatyp sein. Das geht in deinem Fall am einfachsten, indem du statt 1 1.0 schreibst. Zitieren
Guybrush Threepwood Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Also bei mir sagt er so PI=1. Du solltest i auch als Gleitkommawert anlegen, weil sonst bei der Rechnung 1/i auf Null abgeschnitten wird. hmmm...4 Minuten zu langsam:rolleyes: Zitieren
Master Z Geschrieben 25. Februar 2004 Autor Geschrieben 25. Februar 2004 Danke für eure Hilfe!Wie dumm kann man nur sein!Ich glaub ich hätte noch ne Stunde gesucht!Ich weiß ja selber, dass man int mit float nicht kombinieren soll, weil die Nachkommastellen abgeschnitten werden ich hab wirklich nicht auf solch "eine Kleinigkeit" geachtet! Danke :uli Zitieren
Guybrush Threepwood Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Und jetzt berechnet das Programm bei dir PI:confused: Weil wie gsagt bei mir kahm so 1 raus. Zitieren
Goos Geschrieben 25. Februar 2004 Geschrieben 25. Februar 2004 Original geschrieben von Guybrush Threepwood Also bei mir sagt er so PI=1. Na das eroeffnet doch ganz neue Perspektiven. Wenn PI = 1 ist, dann ist der Umfang eines Kreises 2*r = d Wenn also der Umfang gleich dem Durchmesser ist, dann waere der Kreis wohl eine Linie um ueberhaupt einen so grossen Durchmesser aufnehmen zu koennen. Ich glaube, wir sollten uns also in Gedanken schon mal von Runden Kreisen verabschieden :bimei Goos Zitieren
Master Z Geschrieben 26. Februar 2004 Autor Geschrieben 26. Februar 2004 Original geschrieben von Guybrush Threepwood Und jetzt berechnet das Programm bei dir PI:confused: Weil wie gsagt bei mir kahm so 1 raus. Ja!Hab in der for-schleife int i durch double i ersetzt!Jetzt schneidet er den Nachkommabereich nicht mehr ab und um so höher die Zahl ist die ich in der main eingebe und der Funktion übergebe desto genauer ist pi! Zitieren
Guybrush Threepwood Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 Original geschrieben von Goos Na das eroeffnet doch ganz neue Perspektiven. Wenn PI = 1 ist, dann ist der Umfang eines Kreises 2*r = d Wenn also der Umfang gleich dem Durchmesser ist, dann waere der Kreis wohl eine Linie um ueberhaupt einen so grossen Durchmesser aufnehmen zu koennen. Ich glaube, wir sollten uns also in Gedanken schon mal von Runden Kreisen verabschieden :bimei Goos lol:D Original geschrieben von Master Z Ja!Hab in der for-schleife int i durch double i ersetzt!Jetzt schneidet er den Nachkommabereich nicht mehr ab und um so höher die Zahl ist die ich in der main eingebe und der Funktion übergebe desto genauer ist pi! Irgendwie bin ich zu blöd dafür. Wenn ich oben die Funktion nehme und das int durch ein float ersetzte bekomme ich PI=0.723810 raus:confused: Zitieren
Klotzkopp Geschrieben 26. Februar 2004 Geschrieben 26. Februar 2004 In der Funktion fehlt der Faktor 4 aus der Formel. Zitieren
Master Z Geschrieben 27. Februar 2004 Autor Geschrieben 27. Februar 2004 Ja!Sorry!Da hast du recht!Ist ja nur die Funktion ,die *4 hänge ich einfach an dei Funktion dran wenn ich sie in der main aufrufe! Zitieren
Foomy Geschrieben 1. März 2004 Geschrieben 1. März 2004 Ich habe auch mal versucht auf Basis dieser Reihe (Leibniz-Reihe; ==Pi/4 = 1/1 - 1/3 + 1/5...) ein Programm zu entwickeln. Ich habe das so gemacht, dass ich Zähler und Nenner getrennt in Integer-Variablen gespeichtert habe. Ich hab dann versucht den vorgang der Division, wie man ihn auf dem Papier durchführen würde, "nachzubauen". Letztlich bin ich daran gescheitert, dass die Datentypen zu klein sind. spätestens nach dem 10 Summanden wird der Nenner zu groß. Ich denke kürzen der Brüche wird da noch eine Lösung sein. Sollte das nicht helfen wäre eine Lineare Liste zum abspeichern der Bruchkomponenten noch eine Lösung (örks Zeiger). Dazu müsste ich mir aber erst noch genauere Gedanken machen. Gruß Sascha Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.