我正在尝试创建一个程序,该程序演示了一种近似欧拉数的方法。我根据的公式是1 + 1/1! + 1/2! + 1/3! + 1/4!...每当我运行该程序时,它就会开始正确地对其进行逼近,但是在经过多次迭代之后,逼近却开始变得无限小。
下面的程序是我尝试将公式转换为代码的尝试。我提示用户输入1 / n的迭代次数!他们想用(valItr)近似e,并且迭代次数由迭代表示。非常感谢您的帮助。
int迭代= 1;
while (iterations <= valItr)
{
Double approxE = 1;
approxE = approxE + (1 / denomPrev * multiPlier);
denomPrev = denomPrev * multiPlier;
iterations++;
multiPlier++;
Console.WriteLine(approxE);
}
答案 0 :(得分:3)
您的代码比Faruk更好,因为它只需要O(n)乘法,而他需要O(n ^ 2)乘法。但是您在代码中有两个错误。首先,在每个循环中分配approxE = 1
。其次
(1 / denomPrev * multiPlier)
评估为
(1 / denomPrev) * multiPlier
那不是您想要的。如果您更正了这些错误,它将起作用。但是您可以将其整理得更多些,例如:
int valItr = 20;
double denomPrev = 1;
double approxE = 1;
for (int iterations = 1; iterations <= valItr; ++iterations)
{
denomPrev *= iterations;
approxE += 1 / denomPrev;
Console.WriteLine(iterations + ": " + approxE);
}
结果完全正确:
1: 2
2: 2,5
3: 2,66666666666667
4: 2,70833333333333
5: 2,71666666666667
6: 2,71805555555556
7: 2,71825396825397
8: 2,71827876984127
9: 2,71828152557319
10: 2,71828180114638
11: 2,71828182619849
12: 2,71828182828617
13: 2,71828182844676
14: 2,71828182845823
15: 2,71828182845899
16: 2,71828182845904
17: 2,71828182845905
18: 2,71828182845905
19: 2,71828182845905
20: 2,71828182845905
答案 1 :(得分:1)
对于我所看到的,双精度不是非常小的有理数。 如果使用小数,则可以精确,但会引发更多分数的错误。
因此,请留下一些外部帮助。
使用BigRational(BigInteger),您可以按原样使用分数,然后在分数上进行数学运算。
(?![0-9])
NuGet:安装软件包BigRationalLibrary
答案 2 :(得分:0)
用于同一计算的另一种方法可以得出(非常)明显更准确的答案。与horner's rule类似,例如,我们注意到
1+1/1!+1/2!+1/3! = 1 + (1/1)*(1 + (1/2)*(1+1/3))
所以,在C语言中,我们可以写
double e = 1.0 + 1.0/N
while ( --N >= 2)
{ e = 1.0 + e/N;
}
return 1.0 + e;
答案 3 :(得分:-1)
问题在于,在我尝试计算1 / n之前,我需要从前一个分母计算当前分母!
denomPrev = denomPrev * multiplier;
approxE = approxE + (1 / denomPrev);
^固定了它。