2012-03-24 8 views
0

Ich habe versucht, e mithilfe der Reihendarstellung zu approximieren, um so viele Präzisionsziffern wie möglich mit dem unten stehenden Code zu erhalten, aber egal wie viele Terme ich berechne, die Anzahl der Präzisionsziffern scheint gleich zu bleiben. dh:Approximieren e - So viele Präzisionsziffern wie möglich erhalten

2,71828198432922363281250000000000000000000000000000

Ist es mein Ansatz, was falsch ist? Hier ist der Code:

1 #include <stdio.h> 
    2 #include <iostream> 
    3 #include <math.h> 
    4 using namespace std; 
    5 
    6 float factorial (float a) 
    7 { 
    8   if (a > 1) 
    9   { 
10     return (a * factorial (a-1)); 
11   } else 
12   { 
13     return 1; 
14   } 
15 } 
16 
17 int main() 
18 { 
19   float sum = 0; 
20   int range=100000; 
21 
22   for (int i=0; i<=range;i++) 
23   { 
24     sum += pow(-1,i)/factorial(i); 
25   } 
26   sum = pow(sum,-1); 
27   printf("%4.50f\n", sum); 
28 } 
+7

Sie durch die Wahl des Datentyps begrenzt sind: Sie erhalten eine Fehler in der 8. Stelle. Verwenden Sie 'long double' statt' float', um zu sehen, ob die Ergebnisse etwas besser werden. – dasblinkenlight

+2

google for "Was jeder Informatiker über Fließkomma-Mathematik wissen sollte". Wenn Ihre Bedingungen klein genug werden, haben sie keinen Einfluss mehr auf die Summe. –

+0

@gspr: Beachten Sie die letzte Zeile vor dem Drucken. Natürlich ist 'pow()' ein schrecklich langsamer Weg, dies zu tun. –

Antwort

2

Um genauere Zahlen zu erhalten, sollten Sie Ihre Daten Klasse schreiben, die mehr Ziffer speichern, sagen wir, 1000 Ziffern. Der schwierigste Teil ist es, die Operationen +, -, *,/auszuführen. Wenn Sie nur mit der mathematischen Formel experimentieren möchten, können Sie eine andere Sprache wählen, z. B. Python. Es hat Datentypen wie Decimal, Fraction, die genauer berechnen können.

Ich liebe Mathe so dass ich ein Python-Skript zu tun, schreiben die Formel zu testen:

Hier ist das Ergebnis:

After 71 iteration: 
2.71828182845904523536028747135266249775724709369995 
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166429 
+0

Ihre Antwort wäre genial, wenn alles was ich wollte, das Ergebnis wäre (z. B. die Annäherung von e mit so vielen Ziffern wie möglich). Aber ich brauche auch genaue Zeitmessungen des Prozesses und die Anzahl der Bytes, die erforderlich sind, um das Ergebnis zu speichern, weshalb ich in C++ geschrieben habe.Ich dachte, C++ wäre besser im Umgang mit Low-Level-Sachen. Außerdem ist es eine Aufgabe für eine Computer-Organisation-Klasse, und unser Professor ist nicht sehr begeistert von Python, weil es zu hoch ist. – ratsimihah

+0

Also es ist eine Hausaufgabe. Dann denke ich, dass die Verwendung einer C++ - Bibliothek auch nicht akzeptiert wird? Sie können die Decimal-Klasse von Python in C++ implementieren und dann den obigen Code nach C++ portieren. – Ray

0

Sie schlagen die Grenze, wo die addierte Zahl viel kleiner ist als die Summe, und da schwimmt im Grunde rationale Zahlen sind, diese abgeschnitten wird. Hier ist ein gut über the subtleties of floating point numbers

Beispiel lesen:

12345.123 
+ 0.0001 
------------ 
12345.123 

wenn nur die ersten 8 Ziffern in einer Reihe gespeichert werden.

Eine einfache Lösung wäre, vom Bereich bis 0 zu iterieren, so dass Sie Ihre Summe mit den kleinen Zahlen beginnen und die verlorenen Ziffern verfolgen. Als Beispiel:

sum0 = 12345.123 
b0 =  0.0001 
sum1 = sum0 + b0 # 12345.123 
diff1 = (sum1 - sum0) - b0 # 0.0001 
# the result you want is sum1 + diff1 

# keep on iterating and summing 
+0

Dies ist kein Fix für die Grenzen der FP-Genauigkeit - unabhängig von der Methode der Summierung kann das Endergebnis nur so viele Ziffern haben. –

+0

@quant_dev können Sie, wenn Sie den Rest (diff1) verfolgen. So funktionieren gleitende Mittelwertberechnungen. – j13r

+0

Stimmt, aber Sie werden es nie als eine einzelne Fließkommazahl ausdrücken, die das OP versuchte. –