优化在 C 中逼近欧拉数 (e) 的算法
Optimizing an algorithm that approximates the euler number (e) in C
首先,我在这里重新发明轮子。我知道欧拉数在 C 中有一个常数。因为我发现创建科学程序比任何其他类型的问题都容易,所以我用这些问题来练习并成为一名优秀的开发人员。
/* calculating euler number */
#include <stdio.h>
int fat(int x);
int main(void)
{
int n; int y; double en = 1.0; //en = euler number
printf("Entre com o valor de n para a aproximação do número de Euler: \n");//prompt
scanf("%d", &n);//read n
//n big enough -> aproximation for en is close of real value of euler number
if (n < 0){ //if the user input a negative value
printf("Error!\n");
}
else {//if the user is not a troll and enter a positive integer
for (y = 1; y <= n; y++){
en = en + (1.0/(fat(y))); // en = summation(1/fat(y))
//printf("y = %d and en = %.9lf\n", y, en); this line is for studying when en return 'inf'
}
printf("O valor aproximado de e é aproximadamente %.9lf\n", en);//print euler number aproximation
}
}
int fat(int x){//defining the factorial function
int factorial = 1;
int f;
for (f = 1; f <= x; f++){
factorial = factorial * f;
}
return factorial;
}
我编译和运行代码几次,我注意到近似值超过欧拉值n=19,en=2.718281835(最后两位数应该是28)。对于 n 大于 33,程序 returns en = inf。可能是因为 34 的阶乘对于我的代码来说已经太大了。
我的问题是:如何利用这段代码背后的思想,做出更优化的程序,例如不超过的算法欧拉数的值.
我知道,我的代码不是很好,但这是我在没有咨询任何东西的情况下设法构建的,除了一本关于如何获得欧拉数的数学书。提前致谢!
如果将此 1.0/(fat(y))
存储在一个变量中,并按 y
s 进行除法,则可以完全避免计算阶乘。
这样你应该只在你的数据类型的精度开始失败时遇到障碍。
double term = 1.0;
for (y = 1; y <= n; ++y){
term /= y;
en += term; // en = summation(1/fat(y))
}
否则通常的步骤会有所帮助,使用 wider/preciser 数据类型,例如 long int
。但我想这不是您在这里寻找的优化方面。
请您尝试以下操作:
#include <stdio.h>
#include <stdlib.h>
int
main()
{
int i, n;
long double en = 1.0; // Euler's number
long double f = 1.0; // factorial number
printf("Enter the value of n to approximate Euler's number: ");
scanf("%d", &n);
if (n < 1) {
printf("Error\n");
exit(1);
}
for (i = 1; i <= n; i++) {
f *= i;
en += 1 / f;
}
printf("n = %d and en = %.9Lf\n", n, en);
return 0;
}
它输出 n = 12:
n = 12 and en = 2.718281828
并为较大的 n 保持相同的 en
值。
首先,我在这里重新发明轮子。我知道欧拉数在 C 中有一个常数。因为我发现创建科学程序比任何其他类型的问题都容易,所以我用这些问题来练习并成为一名优秀的开发人员。
/* calculating euler number */
#include <stdio.h>
int fat(int x);
int main(void)
{
int n; int y; double en = 1.0; //en = euler number
printf("Entre com o valor de n para a aproximação do número de Euler: \n");//prompt
scanf("%d", &n);//read n
//n big enough -> aproximation for en is close of real value of euler number
if (n < 0){ //if the user input a negative value
printf("Error!\n");
}
else {//if the user is not a troll and enter a positive integer
for (y = 1; y <= n; y++){
en = en + (1.0/(fat(y))); // en = summation(1/fat(y))
//printf("y = %d and en = %.9lf\n", y, en); this line is for studying when en return 'inf'
}
printf("O valor aproximado de e é aproximadamente %.9lf\n", en);//print euler number aproximation
}
}
int fat(int x){//defining the factorial function
int factorial = 1;
int f;
for (f = 1; f <= x; f++){
factorial = factorial * f;
}
return factorial;
}
我编译和运行代码几次,我注意到近似值超过欧拉值n=19,en=2.718281835(最后两位数应该是28)。对于 n 大于 33,程序 returns en = inf。可能是因为 34 的阶乘对于我的代码来说已经太大了。
我的问题是:如何利用这段代码背后的思想,做出更优化的程序,例如不超过的算法欧拉数的值.
我知道,我的代码不是很好,但这是我在没有咨询任何东西的情况下设法构建的,除了一本关于如何获得欧拉数的数学书。提前致谢!
如果将此 1.0/(fat(y))
存储在一个变量中,并按 y
s 进行除法,则可以完全避免计算阶乘。
这样你应该只在你的数据类型的精度开始失败时遇到障碍。
double term = 1.0;
for (y = 1; y <= n; ++y){
term /= y;
en += term; // en = summation(1/fat(y))
}
否则通常的步骤会有所帮助,使用 wider/preciser 数据类型,例如 long int
。但我想这不是您在这里寻找的优化方面。
请您尝试以下操作:
#include <stdio.h>
#include <stdlib.h>
int
main()
{
int i, n;
long double en = 1.0; // Euler's number
long double f = 1.0; // factorial number
printf("Enter the value of n to approximate Euler's number: ");
scanf("%d", &n);
if (n < 1) {
printf("Error\n");
exit(1);
}
for (i = 1; i <= n; i++) {
f *= i;
en += 1 / f;
}
printf("n = %d and en = %.9Lf\n", n, en);
return 0;
}
它输出 n = 12:
n = 12 and en = 2.718281828
并为较大的 n 保持相同的 en
值。