Problem bei der Berechnung von Pi
-
Wie muss ich diese Schleife ändern, damit sie mir die Nachkommastellen mit ausgibt ? Hab es mit Double probiert aber ich bin nen bissl hilflos.. ( cpp noob )
#include <iostream> using namespace std; int main() { int z; // vllt double ? aber funzt au net int b; for (int i=3; i<100; i++) { b=2; if(i==3) { z = 4-(4/3); } else { if((i % 2) == 0) { } else { b = b+1; if((b % 2) == 0) { z = z - (4/i); } else { z = z + (4/i); } } } } cout << "Pie ist: " << z << endl; return 0; }Liebe Grüße PapaSchlumpf
PS: Ich weiß es ist etwas umständlich gelöst ^^ aber von Visual Basic auf C++ ist syntaxmäßig doch eine heftige umstellung in vb wär das keine sache ^^ aber ich will mich mal an eine hochsprache tun

-
Deine Überlegung, dass du vielleicht auf double umsteigen solltest, ist ja schon ganz richtig. Variablen vom Typ Integer speichern dir nur ganze Zahlen. Willst du reelle Zahlen verarbeiten, dann musst du double wählen oder halt float. Aber im Sinne der Genauigkeit würde ich eher immer double wählen.
-
Wenn ich double nehme kommt aber trotzdem 3 raus.... und ich will sie ja eig auf 50 nachkommastellen... also ist mit der formel pi = 4 - 4/3 + 4/5 - 4/7 + 4/9 blabla reicht es wenn ich einfach anstatt
int z;double z;nehme ? bei mir funzt das nicht
-
Naja, 50 Stellen wirst du in double eh nicht Speichern können. Dafür musst du anders an die Speicherung deiner Werte heran gehen oder dir vorgefertigten Bibliotheken für Rechnungen mit großen Zahlen wie GMP angucken.
-
Es funktioniert ja nichtmal mit 2 Nachkommastellen...
-
#include <iostream> using namespace std; int main() { double z(0.0); // vllt double ? aber funzt au net int b(0); for (int i=3; i<100; i++) { b=2; if(i==3) { z = 4.0-(4.0/3.0); } else { if((i % 2) == 0) { } else { b = b+1; if((b % 2) == 0) { z = z - (4.0/i); } else { z = z + (4.0/i); } } } } cout << "Pie ist: " << z << endl; return 0; }Damit klappt zumindest schonmal die formale Ausgabe auf dem Bildschirm. Aber irgendwie ergibt es trotzdem keine sinnvollen Ergebnisse

-
double pi(0.0); for (int i=1;i<=100;i+=2)pi+=(i&2 ? -1 : 1)*4.0/i; std::cout << "Pi ist: " << pi;
Ich würde dir empfehlen, deine Version mal mit dem Debugger durchzugehen, dann solltest du schnell merken, was da schief läuft.
Edit:
#include <iostream> using namespace std; int main() { double z(0.0); // vllt double ? aber funzt au net int b(0); for (int i=3; i<100; i++) { b=2; //Der Fehler liegt hier, b sollte nur einmal vor der Schleife initialisiert werden if(i==3) { z = 4.0-(4.0/3.0); //da das nur einmalig gemacht wird, kann (und sollte) man das ausserhalb der Schleife machen } else { if((i % 2) == 0) //dann doch lieber gleich (i % 2) != 0... ausserdem kannst du die Schleife ohnehin gleich in { //Zweierschritten durchgehen, dann sparst du dir das alles } else { b = b+1; if((b % 2) == 0) { z = z - (4.0/i); } else { z = z + (4.0/i); } } } } cout << "Pie ist: " << z << endl; return 0; }
-
#include <iostream> using namespace std; int main() { double pi (4-4.0/3.0); bool is_even (false); for (int i (5); i < 100; i += 2, is_even ^= is_even) { const double temp (4.0 / static_cast <double> (i)); if (is_even) { z -= temp; } else { z += temp; } } cout << "Pi ist: " << pi << endl; }Ich hoffe, ich hab den Algorithmus an sich jetzt nicht kaputt gemacht ^^
Aber mir gefällts so ein wenig mehr ^^der Vollständigkeit halber noch mal dein Fehler:
z = z - (4.0**/i**);
bb
edit: hab ma auch double genommen - hatte aus gewohnheit float ^^