[英]Working on code to calculate cosine with factorial sum
我一直在为这段代码而苦苦挣扎,只是似乎并没有掌握我在做什么错。
该代码假设要计算:模式[(-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 %f\n", 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 %f\n", i*.1, mycos(i*.1), cos(i*.1));
return 0;
}
谢谢大家的解释,他们给予了极大的帮助!
我看到的一件事是,main中的for循环仅运行2次实际迭代,一次是i == 0,另一次是i == 1。
为了使taylor扩展正常工作,需要通过更多的序列项(更多的循环迭代)来运行它。
我看到的另一件事是,您的分母为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 %f\n", sum);
return 0;
}
1.)您只需在乘数函数return 2*n*factorial(n-1);
乘以偶数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++)
这只会使您的循环运行两次。 尝试更多。 迭代以获得更准确的答案。
为什么要计算系列中每个项目的功效等? 还需要将数字保持在适合数据类型的范围内
即对于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;
}
编辑
#include<stdio.h>
# 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<PRECISION;i++)
{
term=-term*x/(a*(a-1));
s+=term;
a+=2;
}
printf("result=%f",s);
}
您的factorial()
函数实际上计算2 n .n ! ,这可能与您的想法不符。 要计算(2n)! ,则需要从函数主体中删除2*
并调用factorial(2*n)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.