2012-03-24 7 views
0

私は以下のコードを使用して可能な限り多くの精度桁を得るために系列表現を使ってeを近似しようとしていますが、計算する項の数に関係なく、同じままと思われる。すなわち:近似e - できるだけ多くの精度桁を取得する

2.71828198432922363281250000000000000000000000000000

は、それは間違っている、私のアプローチは、ですか? は、ここでは、コードです:

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

あなたは、データ型の選択によって制限されています:あなたが得ます8桁目の誤差。 'float'の代わりに' long double'を使って、結果がやや良いかどうか調べてみましょう。 – dasblinkenlight

+2

google for "すべてのコンピュータ科学者が浮動小数点数学について知っておくべきこと"あなたの条件が十分に小さくなると、彼らはもはや合計に影響を与えません。 –

+0

@gspr:printfの前の最後の行に注意してください。もちろん、 'pow()'は非常に遅い方法です。 –

答えて

2

がより正確な数字を取得するには、より多くの数字、たとえば、1000個の数字を格納し、データのクラスを記述する必要があります。最も難しいのは、+、 - 、*、/演算を行うことです。

数値計算式を試してみるだけなら、Pythonなどの別の言語を選択することができます。より正確な計算を行うことができるDecimal, Fractionのようなデータ型があります。

私は式をテストするためのPythonスクリプトを書くんので、私は数学を愛する:

は、ここでの結果です:

After 71 iteration: 
2.71828182845904523536028747135266249775724709369995 
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166429 
+0

私が望むのは結果だけです(つまり、可能な限り多くの桁でeを近似する)なら、あなたの答えは素晴らしいでしょう。しかし、私はまた、プロセスの正確な時間測定と結果を格納するのに必要なバイト数が必要です。それが私がC++で書いた理由です。私はC++がそれほど低レベルのものを扱う方が良いと考えました。また、それはComputer Organizationクラスの割り当てです。私たちの教授はあまりにも高いレベルなので、Pythonをあまり好んでいません。 – ratsimihah

+0

それは宿題です。それから私はC + +ライブラリを使用しても受け入れられないと思いますか? PythonのDecimalクラスをC++で実装してから、上記のコードをC++に移植することができます。 – Ray

0

追加した数が合計よりもはるかに小さい制限に達しており、フロートは基本的に合理的な数字であるため、これが遮断されます。唯一の最初の8桁の数が保存されている場合

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

:ここで良い約the subtleties of floating point numbers

例を読まれます。

簡単な修正は範囲から0まで繰り返すことで、小さな数字で合計を開始し、失われた数字を追​​跡することができます。例として:

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

これはFP精度の限界に対する修正ではありません。加算の方法にかかわらず、最終結果は非常に多くの桁しか持てません。 –

+0

@quant_devあなたが残りの部分(diff1)を追跡しているならば、そうすることができます。これがスライド平均計算の仕組みです。 – j13r

+0

真ですが、OPがやろうとしていた1つの浮動小数点数として表現することはありません。 –

関連する問題