Eulersche Zahl in C++ |
25.01.2015, 12:23 | AstroNerd | Auf diesen Beitrag antworten » | |||||
Eulersche Zahl in C++ Da einige unter euch vermutlich auch Informatiker bzw. Programmierer sind, hätte ich eine kurze Frage, was C++ angeht. Folgender Quelltext soll mir die Eulersche Zahl ausgeben: #inlcude<iostream> #include<math.h> using namespace std; int main() { double n; double e; for(n=1; n++; ) { e+= pow(1+1/n, n) ;} cout << "Die Eulersche Zahl ist: " << e; return 0; } Jedoch bekomme ich gerade mal die ersten 5 Nachkommastellen. Wenn ich ein long double verwende gibt er nur Käse aus. Könnte mir evtl. jemand weiter helfen ? Mit freundlichem Gruß AstroNerd |
|||||||
25.01.2015, 14:10 | IfindU | Auf diesen Beitrag antworten » | |||||
RE: Eulersche Zahl in C++ Du machst etwas sehr seltsames: Es gilt . Du mischt beides und berechnest . Unabhängig initialierst du e nicht... D.h. wenn der Compiler das nicht netterweise für dich macht, wird da ein Randomwert rauskommen. Edit: Sehe gerade, dass deine Schleife nie abbricht... |
|||||||
25.01.2015, 14:17 | 10001000Nick1 | Auf diesen Beitrag antworten » | |||||
RE: Eulersche Zahl in C++
Wie das? Du hast eine Endlosschleife programmiert, da dürftest du gar keine Ausgabe kriegen. Wieso initialisierst du eigentlich n als double und nicht als integer?
Oder er weigert sich, das Programm überhaupt auszuführen (wie Visual Studio). |
|||||||
25.01.2015, 14:19 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Genau. In dem Fall sollte dann in der Rechnung allerdings auch besser 1+1.0/n stehen, oder 1+1/(double)n stehen, oder sicherheitshalber gleich 1.0+1.0/(double)n. |
|||||||
25.01.2015, 14:43 | Jayk | Auf diesen Beitrag antworten » | |||||
Der Hammer ist ja: Ich wollte mal zum Spaß das Programm compilieren (g++) um zu schauen, was passiert (weil ich mir nicht vorstellen konnte, dass es tatsächlich irgendeine Ausgabe gibt). Na ja:
Behebt man den offensichtlichen Fehler, kommt wie erwartet eine Endlosschleife. @AstroNerd: Offensichtlich ist das, was du gepostet hast, nicht der Sourcecode, den du tatsächlich verwendest. Warum schickst du den nicht mal? |
|||||||
25.01.2015, 15:40 | AstroNerd | Auf diesen Beitrag antworten » | |||||
Vielen Dank erstmal für die vielen Antworten. Nun habe ich ein kleines Nickerchen genommen und den Quelltext überarbeitet (und tatsächlich ist mein geposteter Quelltext nicht ganz der selbe). #include<iostream> #include<math.h> using namespace std; int main(){ long double n; long double e; for (n = 1; n<1000000; n++){ e = pow(1/n + 1 , n);} cout << "Die Eulersche Zahl ist etwa: " << e ; cin.sync(); cin.get(); return 0; } Wenn eine unendliche Schleife berechnet wird, wird der ,,cout'' Befehl erst erfolgen, wenn die Schleife bis zum Ende berechnet worden ist. Da aber meine Schleife kein Ende hat, wird theoretisch auch niemals der ,,cout'' Befehl ausgeführt. Also habe ich nun eine Obergrenze für das Intervall eingegeben, bekomme jedoch immer noch nur schlappe 5 Nachkommastellen raus. Bei einem höheren Intervall meldet der Compiler, dass die Obergrenze zu groß sei. Gibt es evtl. eine andere Möglichkeit, mir einige Hundert (oder Tausend) Nachkommastellen ausgeben zu lassen ? Vielen Dank. AstroNerd |
|||||||
Anzeige | |||||||
|
|||||||
25.01.2015, 16:14 | IfindU | Auf diesen Beitrag antworten » | |||||
Sieh dir die Definitionen oben von mir an. Die zweite bietet sich deutlich mehr zu numerischen Zwecken an....Wie viele Nachkommastellen du da bekommst weiß ich allerdings nicht (mehr als 5 sicherlich). Edit: Und du brauchst keine Schleife, wenn du ständig einen neuen Wert errechnest.... |
|||||||
25.01.2015, 16:26 | 10001000Nick1 | Auf diesen Beitrag antworten » | |||||
Wenn du in deinem Code die Zeile
|
|||||||
25.01.2015, 17:44 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Klar gibt es die, aber sicher nicht auf so naive Weise mit der Verwendung einer double-Variablen (maximal 15-16 Stellen Genauigkeit). Da braucht man C/C++-Bibliotheken, die mit derart langen Zahlen umgehen können, und außerdem ist da eine numerisch ungünstige Formel - da eignen sich andere um Längen besser, z.B. das schon erwähnte . EDIT: Ein Beispiel für eine solche Bibliothek ist die GMP. |
|||||||
25.01.2015, 17:44 | AstroNerd | Auf diesen Beitrag antworten » | |||||
Vielen Dank! Da die Obergrenze jedoch nicht größer sein kann, werden ab der 5. Nachkommastelle keine richtigen Ziffern mehr angegeben :/ Hat jemand noch einen anderen Vorschlag (den Quelltext möglichst simpel und ,,unverändert'' gestalten) ? |
|||||||
25.01.2015, 18:06 | AstroNerd | Auf diesen Beitrag antworten » | |||||
Da mir hier schon angeraten wurde, lieber zu verwenden, habe ich mir überlegt, ob man evtl. darstellen kann, korrigiert mich, falls ich falsch liege: #include<iostream> #include<math.h> using namespace std; int main(){ long double n; long double x; long double sum; long double prod; for (n = 1; n<1000000000; n++){ for(x=2; x<n+1;x++){prod *=1/x;} ; sum += (1/prod);} cout.precision(100); cout << "Die Eulersche Zahl ist etwa: " << 2+sum ; cin.sync(); cin.get(); return 0; } |
|||||||
25.01.2015, 18:19 | zyko | Auf diesen Beitrag antworten » | |||||
Zuerst festlegen, wie genau (Ergebnis) man rechnen will. Danach durch Abschätzung des Restgliedes der Taylorreihe für ein so festlegen, dass der Rest kleiner als die gewünschte Genauigkeit ist. Aber aus numerischen Gründen nicht berechnen sondern rückwärts berechnen. Dadurch werden erst alle kleinen Terme aufaddiert und zuletzt die größeren. Aber auch damit kann nicht beliebig genau gerechnet werden, da die einzelnen Summanden intern bestenfalls (ohne weitere Tricks) double sind. S. a. http://de.wikipedia.org/wiki/Intervallarithmetik Es gibt Intervallarithmetik /Programmiersprachen mit denen nicht nur die Grundrechenarten +, -, *, / sondern auch komplexere Terme mit Genauigkeitsangabe berechnet werden können. |
|||||||
25.01.2015, 18:32 | HAL 9000 | Auf diesen Beitrag antworten » | |||||
Unter Nutzung der genannten GMP könnte ein C++Programm im einfachsten Fall so aussehen:
EDIT: Hab's nochmal überarbeitet, nachdem ich das C++-Interface der GMP gefunden habe - ist so besser lesbar. |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
Die Neuesten » |
|