 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Andreas Rudolph Guest
|
Posted: Mon Nov 24, 2003 8:33 pm Post subject: Nachkommastellen berechnen (bei Pi) |
|
|
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
|
Posted: Wed Nov 26, 2003 8:20 am Post subject: Re: Nachkommastellen berechnen (bei Pi) |
|
|
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.
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
|
Posted: Wed Nov 26, 2003 12:57 pm Post subject: Re: Nachkommastellen berechnen (bei Pi) |
|
|
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
|
Posted: Wed Nov 26, 2003 5:42 pm Post subject: Re: Nachkommastellen berechnen (bei Pi) |
|
|
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
|
Posted: Wed Nov 26, 2003 11:07 pm Post subject: Re: Nachkommastellen berechnen (bei Pi) |
|
|
"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
|
Posted: Thu Nov 27, 2003 9:26 am Post subject: Re: Nachkommastellen berechnen (bei Pi) |
|
|
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
|
Posted: Thu Nov 27, 2003 12:17 pm Post subject: Re: Nachkommastellen berechnen (bei Pi) |
|
|
In article <bq4g07$hel$3 (AT) anderson (DOT) hrz.tu-chemnitz.de> you wrote:
| Quote: | Huebsche Formulierung im Zusammenhang mit der Verwendung von
Ganzzahlarithmetik
|
:-)
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 |
|
 |
|
|
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
|
|