C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Nachkommastellen berechnen (bei Pi)

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Andreas Rudolph
Guest





PostPosted: Mon Nov 24, 2003 8:33 pm    Post subject: Nachkommastellen berechnen (bei Pi) Reply with quote



Hallo an alle!
ich bin c++ Änfanger und habe eine Frage zur Berechnung von Pi. Ich möchte
ein Programm schreiben, welches mittels meiner Fuktion piBerechnen den Wert
von Pi berechnet. Soweit kein Problem. Nun soll der Benutzer des Programmes
eingeben können, auf wieviel Nachkommastellen genau er Pi berechnet haben
möchte. Hier kommt mein Problem:
Ich weiß nicht, wie ich dies Realisieren soll. Den "mathematischen" Ansatz,
d.h. einfach überprüfen wann sich die z.B. 5 Stelle nicht mehr ändert ist
mir klar. Aber wie bekomme ich es in C++ hin, das er nach jedem
Schleifendurchlauf prüft, ob sich die (z.B.) 5 Stelle nach dem Komma noch
ändert?
Bei dem Programm kommt es mir nicht auf die Schnelligkeit an. Es soll
einfach mittels der Funktion piBerechnen wie oben beschrieben Pi berechnet
und dann mit den Kommastellen aus der Eingabe angezeigt werden.
Ich hoffe das Ihr / Sie mir helfen könnt.

Hier der Quellcode des Programms:

#include <iostream.h>
#include <math.h>
#pragma argsused

double summe, nachkomma, schritte, nenner, pi, ergebnis;


// -------------------------------------------------------------
// diese Funktion soll Pi solange berechnen, bis es den genauen
// Wer der Nachkommastellen hat
// -------------------------------------------------------------

long piBerechnen (long nachkomma)
{
/* Summe und Nenner initialisieren */
summe = 1;
nenner = 3;

/* Berechnen der Summe */
for (int i = 1; i <= schritte; i++)
{
if (i % 2)
summe-= 1 / nenner; // Wird nur ausgeführt, wenn i
ungerade

else
summe+= 1 / nenner; // Wird nur ausgeführt, wenn i
gerade
nenner = nenner + 2; // Nenner um erhöhen
}

/* Pi berechnen */
pi = summe * 4;

return (pi);
}


void main()
{

int x;

cout << "Zum Beenden des Programmes '1000' eingeben" << endl;

do
{
/* Eingabe der Anzahl der Rechenoperationen */
cout << "Auf wie viele Nachkommastellen soll "
<< "pi berechnet werden? ";
cin >> nachkomma;

ergebnis = piBerechnen(nachkomma);

/* Pi ausgeben */
cout << "Pi = " << pi << endl;
cout << "======================" << endl << endl;
}

while (schritt!=1000);


}

An dieser Stelle schonmal dank an alle "Helfenden".

MfG
Andreas Rudolph

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
André Pönitz
Guest





PostPosted: Wed Nov 26, 2003 8:20 am    Post subject: Re: Nachkommastellen berechnen (bei Pi) Reply with quote



Andreas Rudolph <Andi74de (AT) t-online (DOT) de> wrote:
Quote:
Schleifendurchlauf prüft, ob sich die (z.B.) 5 Stelle nach dem Komma noch
ändert?

Mal 100000, modulo 10 ist die 5. Stelle nach dem Komma. Hilft das?

Quote:
Bei dem Programm kommt es mir nicht auf die Schnelligkeit an. Es soll
einfach mittels der Funktion piBerechnen wie oben beschrieben Pi berechnet
und dann mit den Kommastellen aus der Eingabe angezeigt werden.
Ich hoffe das Ihr / Sie mir helfen könnt.

Noch 'n paar Kommentare:

'Ihr' ist voellig in Ordnung hier.

Quote:
Hier der Quellcode des Programms:

#include <iostream.h
#include #pragma argsused

Alles nicht Standard.

#include #include <cmath>

using namespace std;

waere besser.

Quote:
double summe, nachkomma, schritte, nenner, pi, ergebnis;

Globale Variablen sollten moeglichst vermieden werden.

Quote:
// -------------------------------------------------------------
// diese Funktion soll Pi solange berechnen, bis es den genauen
// Wer der Nachkommastellen hat
// -------------------------------------------------------------

long piBerechnen (long nachkomma)
{

Bist Du Dir sicher, dass ein 'long' die von Dir gewuenschte Genauigkeit
liefern kann?

Quote:
/* Summe und Nenner initialisieren */
summe = 1;
nenner = 3;

/* Berechnen der Summe */
for (int i = 1; i <= schritte; i++)
{
if (i % 2)
summe-= 1 / nenner; // Wird nur ausgeführt, wenn i

Du rechnest mit ganzen Zahlen.

1 / nenner ist damit 1 fuer nenner == 1 und 0 sonst. Willst Du das?

Quote:
ungerade

else
summe+= 1 / nenner; // Wird nur ausgeführt, wenn i
gerade
nenner = nenner + 2; // Nenner um erhöhen
}

/* Pi berechnen */
pi = summe * 4;

return (pi);
}


void main()

int main() muss es hesiien.

Quote:
{

int x;

Wozu das x?

Quote:

cout << "Zum Beenden des Programmes '1000' eingeben" << endl;

do
{
/* Eingabe der Anzahl der Rechenoperationen */
cout << "Auf wie viele Nachkommastellen soll "
"pi berechnet werden? ";
cin >> nachkomma;

ergebnis = piBerechnen(nachkomma);

/* Pi ausgeben */
cout << "Pi = " << pi << endl;
cout << "======================" << endl << endl;
}

while (schritt!=1000);


}

An dieser Stelle schonmal dank an alle "Helfenden".

Falls Du nicht mehr als eine Million Stellen oder so brauchst, kommst Du
vermutlich am besten, die Zahl einfach fest abzuspeichern (die Million
Stellen gibt's im Netz...) und einfach auf das n-te Zeichen zuzugreifen.

Andre'

--
Those who desire to give up Freedom in order to gain Security, will not have,
nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Karl Heinz Buchegger
Guest





PostPosted: Wed Nov 26, 2003 12:57 pm    Post subject: Re: Nachkommastellen berechnen (bei Pi) Reply with quote



Andreas Rudolph wrote:
Quote:

Hallo an alle!
ich bin c++ Änfanger und habe eine Frage zur Berechnung von Pi. Ich möchte
ein Programm schreiben, welches mittels meiner Fuktion piBerechnen den Wert
von Pi berechnet. Soweit kein Problem. Nun soll der Benutzer des Programmes
eingeben können, auf wieviel Nachkommastellen genau er Pi berechnet haben
möchte. Hier kommt mein Problem:
Ich weiß nicht, wie ich dies Realisieren soll. Den "mathematischen" Ansatz,
d.h. einfach überprüfen wann sich die z.B. 5 Stelle nicht mehr ändert ist
mir klar. Aber wie bekomme ich es in C++ hin, das er nach jedem
Schleifendurchlauf prüft, ob sich die (z.B.) 5 Stelle nach dem Komma noch
ändert?

Zb. dadurch das die Differenz vom letzten Schelifendurchlauf und dem
jetzigen Schleifendurchlauf kleiner als 0.00001 ist. Warum 0.00001?
Naja, Du wolltest doch die 5. Nachkommastelle.

Quote:
Bei dem Programm kommt es mir nicht auf die Schnelligkeit an. Es soll
einfach mittels der Funktion piBerechnen wie oben beschrieben Pi berechnet
und dann mit den Kommastellen aus der Eingabe angezeigt werden.
Ich hoffe das Ihr / Sie mir helfen könnt.

Andre hat ja schon das Pgm kommentiert. Aber kannst Du auch mittels Zufallszahlen
Pi berechnen :-)

--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Gerhard Wesp
Guest





PostPosted: Wed Nov 26, 2003 5:42 pm    Post subject: Re: Nachkommastellen berechnen (bei Pi) Reply with quote

Andreas Rudolph <Andi74de (AT) t-online (DOT) de> wrote:
Quote:
Ich weiß nicht, wie ich dies Realisieren soll. Den "mathematischen" Ansatz,
d.h. einfach überprüfen wann sich die z.B. 5 Stelle nicht mehr ändert ist
mir klar. Aber wie bekomme ich es in C++ hin, das er nach jedem

Dir ist klar, dass der Ansatz

pi/4 = 1 - 1/3 + 1/5 - 1/7 +- ...

zwar stimmt, aber fuer die praktische Berechnung von vielen Stellen,
insbes. bei Anwesenheit von Rundungsfehlern, voellig ungeeignet ist?
Du hast hier 1. extrem langsame Konvergenz und 2. massive Ausloeschung.

LG
-Gerhard
--
Quote:
voice: +43 (0)662 642934 *** web: http://www.cosy.sbg.ac.at/~gwesp/

If emailing to [email]gwesp (AT) cosy (DOT) sbg.ac.at[/email] doesn't work, please try [email]gcw (AT) gmx (DOT) at[/email]!

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Werner Salomon
Guest





PostPosted: Wed Nov 26, 2003 11:07 pm    Post subject: Re: Nachkommastellen berechnen (bei Pi) Reply with quote

"Andreas Rudolph" <Andi74de (AT) t-online (DOT) de> wrote

Quote:
Hallo an alle!
ich bin c++ Änfanger und habe eine Frage zur Berechnung von Pi. Ich möchte
ein Programm schreiben, welches mittels meiner Fuktion piBerechnen den Wert
von Pi berechnet. Soweit kein Problem. Nun soll der Benutzer des Programmes
eingeben können, auf wieviel Nachkommastellen genau er Pi berechnet haben
möchte. Hier kommt mein Problem:
Ich weiß nicht, wie ich dies Realisieren soll. Den "mathematischen" Ansatz,
d.h. einfach überprüfen wann sich die z.B. 5 Stelle nicht mehr ändert ist
mir klar.
Aber wie bekomme ich es in C++ hin, das er nach jedem
Schleifendurchlauf prüft, ob sich die (z.B.) 5 Stelle nach dem Komma noch
ändert?
[...]
Hallo Andreas,


anbei ein Vorschlag wie das aussehen könnte. Ich mache mir dabei
zunutze, dass die Folge um den Zielwert herum iteriert.
// ----8<-----------
#include #include <iomanip> // setprecision, fixed
#include <cmath> // acos
#include <limits>
using namespace std;


double piBerechnen( int nachkomma ) {
double pi = 0.0;

double vorheriger = pi;
const double eps = 0.5 / pow( 10, nachkomma );

for( int nenner = 1, sign = 1;
; nenner += 2, sign = -sign ) {
pi += sign * 4.0 / nenner;

// -- Ende testen
if( fabs( pi - vorheriger ) < eps )
break;
vorheriger = pi;
}
return pi; // siehe Bem. unten
}

int main() {
cout << "Pi "
<< setprecision( numeric_limits << acos(-1.0) << endl;
for( int n = 2; n < 8; ++n )
cout << "Pi (" << n << ") " << fixed << setprecision(n+1)
<< piBerechnen( n ) << endl;
return 0;
}
// ----8<-----------

Bleibt noch zu erwähnen, dass man mit
return (pi + vorheriger) / 2; // Mittelwert für ein besseres PI
wesentliche bessere Werte erhält.

Gruß
Werner

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Pönitz
Guest





PostPosted: Thu Nov 27, 2003 9:26 am    Post subject: Re: Nachkommastellen berechnen (bei Pi) Reply with quote

Gerhard Wesp <gwesp (AT) cosy (DOT) sbg.ac.at> wrote:
Quote:
Dir ist klar, dass der Ansatz

pi/4 = 1 - 1/3 + 1/5 - 1/7 +- ...

zwar stimmt, aber fuer die praktische Berechnung von vielen Stellen,
insbes. bei Anwesenheit von Rundungsfehlern, voellig ungeeignet ist?
Du hast hier 1. extrem langsame Konvergenz und 2. massive Ausloeschung.

Huebsche Formulierung im Zusammenhang mit der Verwendung von
Ganzzahlarithmetik ;-)

Andre'

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Gerhard Wesp
Guest





PostPosted: Thu Nov 27, 2003 12:17 pm    Post subject: Re: Nachkommastellen berechnen (bei Pi) Reply with quote


In article <bq4g07$hel$3 (AT) anderson (DOT) hrz.tu-chemnitz.de> you wrote:
Quote:
Huebsche Formulierung im Zusammenhang mit der Verwendung von
Ganzzahlarithmetik Wink

:-)

Tut er aber nicht: nenner ist ein double. Und pi wird zwar als long
zurueckggegeben, aber main() benutzt dann pi.

Aber trotzdem gibts hier massive Ausloeschung. Siehe

http://docs.sun.com/source/806-3568/ncg_goldberg.html

LG
-Gerhard
--
Quote:
voice: +43 (0)662 642934 *** web: http://www.cosy.sbg.ac.at/~gwesp/

If emailing to [email]gwesp (AT) cosy (DOT) sbg.ac.at[/email] doesn't work, please try [email]gcw (AT) gmx (DOT) at[/email]!

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.