原始过时代码: 编写一个计算欧拉数的算法,直到
我的算法课程教授给了我以下作业:
编写一个 C/C++ 程序,以 eps > 0 的给定精度计算欧拉数 (e) 的值。提示:数 e = 1 + 1/1!+1/2!+ ... + 1 / n!+ ... = 2.7172 ... 可以计算为序列 x_0, x_1, x_2, ... 的元素之和,其中 x_0 = 1, x_1 = 1+ 1/1 !, x_2 = 1 + 1/ 1!+1/2 !, ...,只要条件 |x_(i+1) - x_i|,求和就会继续 >= eps 是有效的。
正如他进一步解释的那样,eps 是算法的精度。例如,精度可以是 1/100 |x_(i + 1) - x_i| = ( x_(i+1) - x_i ) 的绝对值
目前,我的程序如下所示:
#include<iostream>
#include<cstdlib>
#include<math.h>
// Euler's number
using namespace std;
double factorial(double n)
{
double result = 1;
for(double i = 1; i <= n; i++)
{
result = result*i;
}
return result;
}
int main()
{
long double euler = 2;
long double counter = 2;
long double epsilon = 1.0/1000;
long double moduloDifference;
do
{
euler+= 1 / factorial(counter);
counter++;
moduloDifference = (euler + 1 / factorial(counter+1) - euler);
} while(moduloDifference >= epsilon);
printf("%.35Lf ", euler );
return 0;
}
问题:
- 看来我的 epsilon 值无法正常工作。它应该控制精度。例如,当我希望精度为 5 位时,我将其初始化为 1.0/10000,并在 8 位(. 718 0)之后被截断之前输出 3 位数字。
- 当我使用 long double 数据类型并且 epsilon = 1/10000 时,我的 epsilon 的值为 0,并且我的程序无限运行。然而,如果将数据类型从 long double 更改为 double,它就可以工作。为什么使用 long double 数据类型时 epsilon 变为 0?
- 如何优化求欧拉数的算法?我知道,我可以摆脱该函数并即时计算欧拉值,但是在每次尝试这样做之后,我都会收到其他错误。