0

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

2.718281984329223632812500000000000000000000000000

間違っているのは私のアプローチですか?コードは次のとおりです。

  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 } 
4

2 に答える 2

2

より正確な数字を取得するには、より多くの数字、たとえば 1000 桁を格納する on データ クラスを記述する必要があります。一番難しいのは、+、-、*、/ の操作です。

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

私は数学が大好きなので、式をテストするための Python スクリプトを作成します。

from decimal import Decimal, getcontext
prec = 100
getcontext().prec = prec

fac = Decimal(1)/2
sum = Decimal(0)
eps = Decimal(0.1)
eps = eps**prec

realE = '2.71828182845904523536028747135266249775724709369995'

i = 3
while 1:
    ds = fac - fac/i
    sum += ds
    if ds < eps: break
    fac /= i * (i+1)
    i += 2

print 'After %d iteration:' % i
print realE
print str(1/sum)

結果は次のとおりです。

After 71 iteration:
2.71828182845904523536028747135266249775724709369995
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166429
于 2012-03-24T19:18:34.660 に答える
0

追加された数が合計よりもはるかに小さいという制限に達しています。浮動小数点数は基本的に有理数であるため、これは切り捨てられます。これは、浮動小数点数の微妙さについての良い読み物です

例:

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

最初の 8 桁のみが数値に保存されている場合。

簡単な修正は、範囲から 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
于 2012-03-24T18:16:17.647 に答える