0

我一直在尝试使用系列表示来近似 e,以使用下面的代码获得尽可能多的精度数字,但无论我计算多少项,精度数字的数量似乎保持不变。IE:

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

2 回答 2

2

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

如果你只是想试验一下数学公式,你可以选择另一种语言,比如PythonDecimal, 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 回答