使用代码来计算余数的阶乘和
我一直在努力处理这些代码,但似乎并没有把握我做错了什么。
该代码假设计算:具有模式[(-1)^ i(x)^ 2i] /(2i)的一系列“余弦”的和!
这是我迄今为止的代码:
#include <stdio.h>
#include <math.h>
float factorial(int n){
if (n==0)
return 1;
else
return 2*n*factorial(n-1);
}
int main (){
float i, n;
float sum=0;
printf("Enter desired interger: ");
scanf("%f", &n);
for (i=0; i<=1; i++)
sum = sum + (pow(-1,i)*pow(n,2*i))/(factorial(n));
printf("The value is %fn", sum);
return 0;
}
我仍在努力,任何信息或帮助将不胜感激!
编辑:
只是修复了它们,这是我必须用于教授的新格式:
#include <stdio.h>
#include <math.h>
int factorial(int n)
{
if (n==0) return 1;
else
return n*factorial(n-1);
}
float mycos(float x)
{
float sum=0;
int i;
for (i=0;i<=10;i++) sum = sum + (pow(-1,i)*pow(x,2*i))/factorial(2*i);
return sum;
}
int main()
{
int i=1;
printf(" x mycos(x) cos(x)n");
for (i=1;i<=10;i++)
printf(" %f %f %fn", i*.1, mycos(i*.1), cos(i*.1));
return 0;
}
谢谢大家的解释,他们帮了大忙!
我看到的一件事是,你的for循环只能运行2次真正的迭代,一次为i == 0,再次为i == 1。
为了泰勒扩展能够相当有效地工作,需要通过更多的序列术语来运行(更多循环迭代)。
我看到的另一件事是,你的分母是n! 而不是(2 * n)!
为了提高效率,我可能还会执行如下的阶乘例程:
unsigned int factorial(int n){
unsigned int product = 1;
for(int I = 1; I <= n; I++) product *= I;
return product;
}
上述因子例程用于更精确的因子计算,也许您不需要此目的。 为了您的目的,也许浮点变体可能会足够好。
float factorial(int n){
float product = 1;
for(int I = 1; I <= n; I++) product *= (float)I;
return product;
}
我还应该注意到为什么我要说以这种方式进行阶乘。 一般来说,循环结构比递归对象更有效率。 你当前的实现是递归的,因此我提供的实现应该从性能和内存利用率上更有效率。
考虑到计算费用,你需要停止计算一个点的序列。 你走得越多,结果就会越精确,但程序花费的时间越多。 这个简单的程序如何:
#include <stdio.h>
#include <math.h>
#define ITERATIONS 10 //control how far you go
float factorial(int n){
if (n==0)
return 1;
else
return n*factorial(n-1);
}
int main (){
float n;
float sum=0;
printf("Enter desired float: ");
scanf("%f", &n);
int c, i;
for (i=0; i<=ITERATIONS; i++) {
c = (i%2)==0? 1 : -1;
sum = sum + (c*pow(n,2*i+1))/(factorial(2*i+1));
}
printf("The value is %fn", sum);
return 0;
}
你的factorial()
函数实际上计算2n.n !,这可能不是你想到的。 要计算(2n)!,需要从函数体中移除2*
并调用factorial(2*n)
。
上一篇: Working on code to calculate cosine with factorial sum
下一篇: Need an algorithm to calculate pi in parallel with pthreads in c