Leibniz-Reihe in C++ |
20.05.2016, 15:38 | AstroNerd | Auf diesen Beitrag antworten » | |||||
Leibniz-Reihe in C++ Ich habe eben ein Programm in C++ geschrieben, welches die Leibnitz-Reihe zur Berechnung von Pi darstellt.
Egal welche Zahl ich für a eingebe, es kommen gerade mal 5 Nachkommastellen raus (3.14159). Ich habe versucht, P auch als long double zu deklarieren, hat auch nicht funktioniert. Ich will ein Programm, bei dem mein Rechner (solange er kann und nicht abstürzt) einzelnd Pi Nachkommastellen berechnet/ausgibt. Wie muss dieser Quelltext ausschauen/geändert werden, damit ich so viel Nachkommastellen rausbekomme, wie ich will ? Mit freundlichem Gruß AstroNerd |
|||||||
20.05.2016, 15:42 | IfindU | Auf diesen Beitrag antworten » | |||||
RE: Leibnitz-Reihe in C++ Siehe hier: http://www.cplusplus.com/reference/iomanip/setprecision/ Es wird aber nicht beliebig genau werden können, weil irgendwann ein underflow auftritt. |
|||||||
20.05.2016, 15:46 | AstroNerd | Auf diesen Beitrag antworten » | |||||
RE: Leibnitz-Reihe in C++ Danke Was ist ein underflow ? |
|||||||
20.05.2016, 15:57 | IfindU | Auf diesen Beitrag antworten » | |||||
RE: Leibnitz-Reihe in C++ Gleitkommazahlen entscheiden sich immer, ob sie gerade eine große oder kleine Zahl darstellen. So können sie einen großen Bereich mit relativ kleinem Fehler abdecken. Das Problem ist, wenn du eine große Zahl hast, kann sie nicht viele Nachkommastellen darstellen. Wenn du eine kleine Zahl drauf addierst, kann die Gleitkommazahl die Information nicht verwerten und wirft sie weg. Effektiv addierst du irgendwann also nur noch Nullen auf. Von dem anderen Problem, dass die Divison irgendwann 0 liefert, weil das Ergebnis zu klein wird. Edit: Eine Idee um das zu umgehen: Man addiert nicht immer zu der Zahl P, sondern summiert zwischenzeitlch viele kleine Zahlen zu einer anderen Zahl Q auf. Und die Zahl Q verrechnet man mit P. Ich habe leider keine praktische Erfahrung wie viel man wirklich gewinnt. |
|||||||
20.05.2016, 16:00 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
@AstroNerd Du nutzt die Arkustangens-Potenzreihe am Rande des Konvergenzintervalls, nämlich für - dort, wo sie extrem langsam konvergiert: Der Approximationsfehler liegt etwa in der Größenordnung des letzten Gliedes vor Abbruch: Bei hast du demnach nur etwa 5 Nachkommastellen. Wenn du dieselbe Reihe (*) beispielsweise für nutzt, geht es wesentlich flotter mit der Konvergenz. P.S.: Noch ein paar Anmerkungen zum obigen C++-Quelltext: 1) p ist uninitialisiert - das geht gar nicht! Manche Compiler mögen das stillschweigend mit Null initialisieren, darauf verlassen kann man sich (insbesondere bei lokalen Variablen) aber nicht. Es sollte also dort besser "double p = 0.0;" in der Deklaration stehen. 2) Wieso "double k" ? Für den Laufindex der Schleife passt besser "int k". 3) Wenn du willst, dass mehr als 5 Nachkommastellen angezeigt (!) werden, dann musst du die Ausgabezeile z.B. in cout << "Pi ist ungefähr " << setprecision(15) << 4*P; ändern. Im Vorspann fehlt dazu noch ein #include <iomanip> |
|||||||
20.05.2016, 19:35 | Leopold | Auf diesen Beitrag antworten » | |||||
Mit einem Korrektursummanden läßt sich die Konvergenz von verbessern. Es gilt: Als Beispiel nehmen wir : Oder : |
|||||||
Anzeige | |||||||
|
|||||||
20.05.2016, 20:24 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Mit double kommst du "nur" bis ca. 15 Nachkommastellen. Wenn du mehr wünschst, dann solltest du nochmal in deinen alten Thread schauen: Eulersche Zahl in C++ |
|||||||
21.05.2016, 00:36 | AstroNerd | Auf diesen Beitrag antworten » | |||||
Vielen Dank |
|||||||
21.05.2016, 08:53 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Wie im anderen Thread hier noch meine Vorstellung, wie ein C++-Programm zur -Berechnung basierend auf aussehen könnte, mit (in weiten Grenzen) beliebiger Stellenzahl unter Nutzung der GMP:
|
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|