解决n!用C(方程式误差)
在我学习C语言的过程中,我遇到了一个给我带来一些问题的任务。我需要为公式n!的近似值建立一个方程!,可以描述为: n!=n^n*e^(-n)*sqrt(2(2*n+1/3)*PI),但是我无法使我的值与实际值相一致。5! = 120英寸 我可以得到一些148磅的值 无法找出我的代码错误的地方:解决n!用C(方程式误差),c,math,equation,C,Math,Equation,在我学习C语言的过程中,我遇到了一个给我带来一些问题的任务。我需要为公式n!的近似值建立一个方程!,可以描述为: n!=n^n*e^(-n)*sqrt(2(2*n+1/3)*PI),但是我无法使我的值与实际值相一致。5! = 120英寸 我可以得到一些148磅的值 无法找出我的代码错误的地方: #include <stdio.h> #include <math.h> #define PI 3.14156 #define E_CONST 2.7828 int main
#include <stdio.h>
#include <math.h>
#define PI 3.14156
#define E_CONST 2.7828
int main ()
{
double num;
double calc, first, second, third, fourth;
printf("Give an int: ");
scanf("%lf", &num);
first = pow(num , num);
second = pow(E_CONST, -num);
third = (2 * num + 1/3);
fourth = sqrt(2*third*PI);
//calc = first * second * fourth;
calc = pow(num, num) * pow(E_CONST, -num) * sqrt(2*(2*num+(1/3))*PI);
printf("Input: %f", num);
printf("1: %.2f\n2: %.10f\n3: %.8f\n4: %.2f\n", first, second, third, fourth);
printf("\nInt was: %.2f\n\nApproximate number: %.5f", num, calc);
return 0;
}
#包括
#包括
#定义PI 3.14156
#定义E_常数2.7828
int main()
{
双数;
双重计算,第一,第二,第三,第四;
printf(“给出一个整数:”);
scanf(“%lf”、&num);
第一个=功率(num,num);
秒=功率(E_CONST,-num);
第三=(2*num+1/3);
第四个=sqrt(2*3*PI);
//计算=第一*第二*第四;
计算=pow(num,num)*pow(E_CONST,-num)*sqrt(2*(2*num+(1/3))*PI);
printf(“输入:%f”,num);
printf(“1:%.2f\n2:%.10f\n3:%.8f\n4:%.2f\n”,第一、第二、第三、第四);
printf(“\n它是:%.2f\n\n近似值:%.5f”,num,calc);
返回0;
}
感觉我什么都试过了。代码有点凌乱,但这是因为我现在对它进行了太多的混乱。您似乎陷入了
1/3
的整数除法陷阱,它的值为0
。您需要使用浮点常量将其写为1.0/3.0
您可能需要键入1.0/3.0
才能获得三分之一。3.14156
对于PI
来说是一个坏值:最好使用3.1416
,或者3.14159
,或者4*atan(1)
,或者对于POSIX实现,M_PI
2.7828
对于e
来说是一个非常糟糕的值:最好使用2.7183
,或者exp(1)
,或者对于POSIX实现,M\u e
1/3
是整数除法,结果是0:最好使用1.0/3
此外,您的近似值不正确。问题是
第三个是否等于(2*(num+1/3))或((2*num)+1/3)?不确定,但可能
1/3
的计算结果为0
(整数除法)。我肯定地说,这一行就是错误所在-它是模糊和错误的。。。根据您可能需要的正确优先级:第三个=((2*num)+((float)1/(float)3))或第三个=(2*(num+((float)1/(float)3))@Matt:why(float)
?我认为几乎总是使用double
更好。另外,3.14
是一个double
:)我们大约每周有一次,所以会有更多的机会。非常感谢。将努力记住双打的.0。事实上,这是一个错误的公式(以及我错误的e类型),但事实上这是因为我使用的书中所写的公式。为什么不直接使用math.h
中的mu PI
宏?@DarkDust:mu PI
不是。Through.+1需要它来检查e
的值。我认为这不仅是非常糟糕的,而且是错误的,因为<代码> 1 /代码>丢失了。
n^n * e^(-n) * sqrt((2*n+1/3)*PI)