使用循环计算 e 常数的 C++ 程序
C++ Program to Calculate e constant using loops
我被要求创建一个简单的程序来通过询问值 i(准确度)然后使用公式 1 +1/1 来计算 e! + 1/2! + 1/3! +⋯+1!
我得到一个非常接近的值,但它仍然不正确。我哪里出错了,有什么方法可以改进代码?
#include <iostream>
using namespace std;
int main()
{
double e=0.0;
double factorial=0;
int i=0;
int j,k=0;//counter variables
cout<<"Enter degree of accuracy: ";
cin>>i;
for(j=0;j<=i;j++) //for loop to calculate 'e'
{
factorial=1; //To reset factorial to 1 for every value of j
for(k=1;k<=j;k++)//for loop to calculate factorial
{
factorial*=k;
}
e+=(1/factorial);
}
cout<<"Value for e given i: "<<e<<endl;
system("pause");
return 0;
}
两个需要改进的地方:
您的"not correct"可能是舍入误差造成的。对正数的递减序列求和时,从小到大求和总能减少舍入误差。您可以通过计算数字数组 [1/1!, 1/2!, 1/3!, ..., 1/i!] 并从末尾求和来实现。同时,您可能想要查看用于补偿舍入误差的算法。 Kahan summation algorithm.
上的维基百科文章是一个很好的参考
您在计算阶乘方面所做的工作比您需要做的要多得多。每次通过外循环时,您都需要计算 i
的阶乘,但(除了第一次)您刚刚计算完前一个值 (i-1
) 的阶乘。因此,不是通过内部循环将 factorial
重置为 1 和 运行,只需将前一个阶乘值乘以 i
即可。 (哦,在程序开始时将 factorial
初始化为 1 而不是 0。)
此外,我不确定 "degree of accuracy" 是否与 "number of terms in the expansion" 相同。您可能想向要求您创建此程序的人澄清这一点。
我被要求创建一个简单的程序来通过询问值 i(准确度)然后使用公式 1 +1/1 来计算 e! + 1/2! + 1/3! +⋯+1! 我得到一个非常接近的值,但它仍然不正确。我哪里出错了,有什么方法可以改进代码?
#include <iostream>
using namespace std;
int main()
{
double e=0.0;
double factorial=0;
int i=0;
int j,k=0;//counter variables
cout<<"Enter degree of accuracy: ";
cin>>i;
for(j=0;j<=i;j++) //for loop to calculate 'e'
{
factorial=1; //To reset factorial to 1 for every value of j
for(k=1;k<=j;k++)//for loop to calculate factorial
{
factorial*=k;
}
e+=(1/factorial);
}
cout<<"Value for e given i: "<<e<<endl;
system("pause");
return 0;
}
两个需要改进的地方:
您的"not correct"可能是舍入误差造成的。对正数的递减序列求和时,从小到大求和总能减少舍入误差。您可以通过计算数字数组 [1/1!, 1/2!, 1/3!, ..., 1/i!] 并从末尾求和来实现。同时,您可能想要查看用于补偿舍入误差的算法。 Kahan summation algorithm.
上的维基百科文章是一个很好的参考
您在计算阶乘方面所做的工作比您需要做的要多得多。每次通过外循环时,您都需要计算
i
的阶乘,但(除了第一次)您刚刚计算完前一个值 (i-1
) 的阶乘。因此,不是通过内部循环将factorial
重置为 1 和 运行,只需将前一个阶乘值乘以i
即可。 (哦,在程序开始时将factorial
初始化为 1 而不是 0。)
此外,我不确定 "degree of accuracy" 是否与 "number of terms in the expansion" 相同。您可能想向要求您创建此程序的人澄清这一点。