【发布时间】:2021-01-13 07:55:07
【问题描述】:
原始过时代码: Write an algorithm that compute the Euler's number until
算法课的教授给了我以下作业:
编写一个 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 后被截断之前输出 3 位(.7180)。
- 当我使用 long double 数据类型并且 epsilon = 1/10000 时,我的 epsilon 的值为 0,我的程序将无限运行。然而,如果将数据类型从 long double 更改为 double,它就可以工作。为什么使用 long double 数据类型时 epsilon 变为 0?
- 如何优化求欧拉数的算法?我知道,我可以摆脱该函数并即时计算欧拉值,但每次尝试这样做之后,我都会收到其他错误。
【问题讨论】:
-
在将其与您的 epsilon 进行比较之前,您必须获取差异的绝对值
-
1.为什么是阶乘?你知道你正在计算
1, 1*2, 1*2*3, 1*2*3*4 ...。那么为什么不使用最后一个结果并将其乘以i呢? 2. 由于 Jerry Coffin 的回答建议添加大小值不起作用......他建议颠倒顺序,但如果不知道n提前或拥有“无限”内存,这是不可能的。相反,您需要像我在here look for[edit1] integration precision中所做的那样将子结果分成大小不等 -
此外,如果您不受方程约束,还有一种方法更适合使用
e = (1+1/x)^x在二进制计算机上计算e,请参阅 Euler number with tasks... 精度只是一个函数的bits可以从log(precision)/log(2)计算...但是这将不再需要差异测试,因此如果这是一项作业,则可能不会将其视为正确的作业... -
@Secundi 是的,我会将
.0添加到所有浮动文字中,以确保不会发生整数/浮点数或舍入之间的转换......我在处理这些东西时有点偏执使用编译器(不时)可以1/2.5截断为整数算术,然后再转换回浮点数,使事情变得不精确和缓慢...... -
@max,请在这里更新您的问题,因为您几乎重复的问题已经收到了一些有用的答案,尤其是在优化方面。也许应该将原始问题标记为重复。
标签: c++ algorithm factorial eulers-number