近似e - 获得尽可能多的精确数字

时间:2012-03-24 18:11:55

标签: c++ series approximation

我一直在尝试使用系列表示逼近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 } 

2 个答案:

答案 0 :(得分:2)

要获得更准确的数字,您应该编写存储更多数字的数据类,例如1000位数。最难的部分是对+, - ,*,/操作。

如果你想要的只是试验数学公式,你可以选择其他语言,例如 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

答案 1 :(得分:0)

你正在达到增加的数量远小于总和的限制,并且因为浮点数基本上是有理数,所以这是被切断的。这是关于the subtleties of floating point numbers

的好读物

示例:

 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