我一直在努力解决这个问题,似乎并没有理解我做错了什么。
代码假设计算:一系列具有模式[(-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;
}
谢谢大家的解释,他们帮了大忙!
答案 0 :(得分:3)
我看到的一件事是,你在主内部的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;
}
我还应该注意为什么我会以这种方式表达阶乘。通常,循环结构比其递归副本更有效。您当前的实现是递归的,因此我提供的实现应该从性能和内存利用率上提高效率。
答案 1 :(得分:2)
考虑到计算费用,您需要停止计算某个点的系列。你去的越多,结果就越准确,但你的程序花费的时间越多。这个简单的程序怎么样:
#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;
}
答案 2 :(得分:1)
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++)
,这只会运行你的循环两次。尝试更多不。迭代的更准确的anwer。
答案 3 :(得分:1)
为什么要为系列中的每个项目计算功率等?还需要将数字保存在适合数据类型的范围内
即。为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;
}
修改强>
答案 4 :(得分:1)
#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);
}
答案 5 :(得分:0)
您的factorial()
函数实际上计算 2 n .n!,这可能不是您想到的。要计算(2n)!,您需要从函数体中删除2*
并调用factorial(2*n)
。