[C] Pi berechnen

Azi

Erfahrenes Mitglied
Nach langer Zeit programmiere ich wieder etwas in C. Aber iregdnwie scheint das nicht so ganz zu funktionieren... Naja, hier der total kommentierte Code:
Code:
/*
Nach der Formel:
 pi 01 01 01 01 01 01 01 01 01 01 
 __=__-__+__-__+__-__+__-__+__-__ 
 04 01 03 05 07 09 11 13 15 17 19 ...
 */
#include <stdio.h>
int main(int argc, char** argv)
{
/* Wenn ein Parameter angegeben */
if(argc == 2){
              /* I ist der angegebene Parameter */
              int i=atoi(argv[1]);
              /* Unser Zähler, der bei jedem Durchgang hochgezählt wird */
              int counter;
              /* Pi muss natürlich viele Nachkommastellen haben, deshalb long double */
              long double pi=0;
              /* J wird am Ende unser Pi werden, also auch ein long double */
              long double j=0;
              /* K ist bei jeder Berechnung der Nenner des Bruches */
              int k=1;
              /* L dient zum Wechsel von Addition und Subtraktion */
              int l=2;
              /* Noch eine Ausgabe, die zeigt, dass das Programm nicht abgestürzt ist */
              printf("\nEs wird gerechnet");
              /* Die Schleife wird so oft wiederholt, wie der angegebene Parameter sagt */
              for(counter=0;counter<i;counter++){
                                                 /* Nochmal eine Ich-bin-nicht-abgestürzt-Ausgabe */
                                                 printf(".");
                                                 /* dieses mal die Addition */
                                                 if(l==2){
                                                          j=j+1/k;
                                                          /* L verkleinern, damit beim nächsten Mal subtrahiert wird */
                                                          l--;
                                                          /* den Nenner um 2 vergrößern */
                                                          k=k+2;
                                                          }
                                                 /* Und hier die Subtraktion */
                                                 else if(l==1){
                                                               j=j-1/k;
                                                               /* L vergrößern, damit beim nächsten Mal addiert wird */
                                                               l++;
                                                               /* den Nenner um 2 vergrößern */
                                                               k=k+2;
                                                               }
                                                 }
              /* Pi ist das jetzige J mal 4 */
              pi=j*4;
              /* und die Ausgabe */
              printf("\n\n\n\tPi ist %Lf\n\n\n",pi);
              }
/* Wenn kein Parameter angegeben... */           
else{
     printf("pi [Genauigkeit]");
     }
return 0;
}

Die Ausgabe ist andauernd folgende:
Code:
>pi 5

Es wird gerechnet.....


        Pi ist 0.000000
 

sceada

Grünschnabel
Nach langem herumspielen mit printf`s um zu sehen wo was nicht stimmt hab ichs jetzt..war eigentlich relativ einfach ;)
Soweit ich das beurteilen kann (bin aber auch nocht soo gut im C Programmieren ;) ) waren 2 "Fehler" im Code:
1. "long double" bei j und pi, laut einem Pdf über C welches ich habe gibts "long double" nicht, nur double. (long nur bei "long int")
2. Anscheinend funktioniert das Rechnen mit Double`s und k, als Integer nicht.
Wenn k auch ein Double ist (oder Float, geht auch) dann funktioniert es.

Also hier mal der Code, mit dem funktioniert es bei mir:
Code:
#include <stdio.h>
int main(int argc, char** argv)
{
if(argc == 2){
              int i=atoi(argv[1]);
              int counter;
              double pi=0;
              double j=0;
              double k=1;
              int l=2;
              printf("\nEs wird gerechnet");
              for(counter=0;counter<i;counter++){
                                                 printf(".");
                                                 if(l==2){
                                                          j=j+1/k;
                                                          l--;
                                                          k=k+2;
                                                          }
                                                 else if(l==1){
                                                               j=j-1/k;
                                                               l++;
                                                               k=k+2;
                                                               }
                                                 }
              pi=j*4;
              printf("\n\n\n\tPi ist %Lf\n\n\n",pi);
              }          
else{
     printf("pi [Genauigkeit]");
     }
     }
(Kommentare gelöscht damits nocht so lang wird ;) )

mfg, sceada
 

Azi

Erfahrenes Mitglied
Vielen Dank, es klappt jetzt wirklich! Jetzt gibt es nur ein Problem: Pi kann nur auf 6 Stellen genau ausgerechnet werden. Wie komme ich nun an mehr Stellen?
 

elmyth

Erfahrenes Mitglied
Off Topic:
<k2xl> in 1998, i made a C++ program to calculate pi to a billion digits.
<k2xl> i coded it on my laptop (pentium 2 i think) and then ran the program.
<k2xl> the next day i got a new laptop but decided to keep the program running.
<k2xl> it's been over seven years now since i ran it. and this morning it finished calculating.
<k2xl> the output:
<k2xl> "THE VALUE OF PI TO THE BILLIONTH DIGIT IS = "
<k2xl> mindblowing eh?
<k2xl> i looked in the code of my program, and i found out that i forgot to output the value :(.
 

Azi

Erfahrenes Mitglied
elmyth hat gesagt.:
Off Topic:
<k2xl> in 1998, i made a C++ program to calculate pi to a billion digits.
<k2xl> i coded it on my laptop (pentium 2 i think) and then ran the program.
<k2xl> the next day i got a new laptop but decided to keep the program running.
<k2xl> it's been over seven years now since i ran it. and this morning it finished calculating.
<k2xl> the output:
<k2xl> "THE VALUE OF PI TO THE BILLIONTH DIGIT IS = "
<k2xl> mindblowing eh?
<k2xl> i looked in the code of my program, and i found out that i forgot to output the value :( .
[Auch Off Topic]
:D :D :D :D :D :D ROFLMAO, das is ja echt witzig! Passt auch echt gut, ich glaub, das mach ich auch mal, bis auf den Teil mit der Ausgabe^^
[/Auch Off Topic]

Jetzt aber bitte nicht vergessen, dass ich nach einer Möglichkeit suche, mehr Stellen hinter dem Komma zu bekommen.
 
Zuletzt bearbeitet von einem Moderator:

sceada

Grünschnabel
Die einzige Möglichkeit die ich dafür kenne ist, die Ausgabe am Ende zu ändern in das hier:
Code:
printf("\n\n\n\tPi ist %1.16f\n\n\n",pi);

Damit werden z.B. 16 Nachkommastellen erzwungen (%1.16 -> 16 Nachstellen, %1.5 -> 5 Nachstellen, etc...)
Das Problem dabei ist, mehr als 16 Nachtstellen haben keinen Sinn da dann nur noch Nuller dastehen (habs grade getestet), ich nehme an das Double nicht mehr aufnehmen kann.
(ich habs auch mit Float getestet, das gleiche...16 Stellen ist max.)

Also wenn du mehr als 16 Stellen willst, musst du warten bis sich hier ein Profi meldet :>

mfg, sceada
 

Azi

Erfahrenes Mitglied
sceada hat gesagt.:
Also wenn du mehr als 16 Stellen willst, musst du warten bis sich hier ein Profi meldet :>

Hmm, schade. Aber zum Glück weiß ich bescheid, wie man einen C-Profi hier im Forum findet (-->Signatur:))

Edit: Ich habe mit "Pi 10000000" folgendes bekommen: Pi ist 3.1415925535898470.
 
Ich bin zwar kein C-Profi… aber hier würde es sich anbieten, eine Bibliothek zu verwenden, die es erlaubt, Fließkommazahlen mit beliebiger Genauigkeit zu verarbeiten. Falls es auch C++ sein darf, könnte man hierbei auf CLN (Class Library for Numbers) zurückgreifen.
 

Azi

Erfahrenes Mitglied
Das Problem ist, dass das Ding zur Installation make braucht - unter Windows ein kleines Problem. Ich habe zwar auch Gentoo Linux auf dem Computer, allerdings muss die Datei eine Windows-Exe sein.