研究使用阶乘和计算余弦的代码

我一直在努力解决这个问题,似乎并没有理解我做错了什么。

代码假设计算:一系列“余弦”的总和,带有模式[(-1)^ i(x)^ 2i] /(2i)!

图案

到目前为止,这是我的代码:

#include  #include  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 %f\n", sum); return 0; } 

我仍在努力,任何信息或帮助将不胜感激!

编辑:

只是修复了它们,这是我必须用于教授的新格式:

 #include  #include  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 %f\n", 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  #include  #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 %f\n", sum); return 0; } 

1.)你只是在因子函数return 2*n*factorial(n-1);乘以偶数no.s return 2*n*factorial(n-1); 将只给予甚至没有。 相反,你可以用2n替换n – sum = sum + (pow(-1,i)*pow(n,2*i))/(factorial(2n)); 这将给出正确的(2n!)。 2.)检查for (i=0; i<=1; i++)的迭代次数for (i=0; i<=1; i++)这将只运行你的循环两次。 尝试更多不。 迭代的更准确的anwer。

为什么要计算系列中每个项目的功率等? 还需要将数字保持在适合数据类型的范围内

即为cos

 bool neg_sign = false; float total = 1.0f; float current = 1.0f; for (int i = 0; i < length_of_series; ++i) { neg_sign = !neg_sign; current = current * (x / ((2 * i) + 1)) * (x / (( 2 * i) + 2)); total += neg_sign ? -current : current; } 

编辑

请参阅http://codepad.org/swDIh8P5

 #include # define PRECISION 10 /*the number of terms to be processed*/ main() { float x,term=1,s=1.0; int i,a=2; scanf("%f",&x); x=x*x; for(i=1;i 

你的factorial()函数实际计算2 n .n ,这可能不是你想到的。 计算(2n)! ,你需要从函数体中删除2*并调用factorial(2*n)