Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解决n!用C(方程式误差)_C_Math_Equation - Fatal编程技术网

解决n!用C(方程式误差)

解决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

在我学习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 ()
{

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)