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