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

时间:2014-02-26 19:13:23

标签: c

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

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

pattern

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

#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;
}

谢谢大家的解释,他们帮了大忙!

6 个答案:

答案 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;
}

修改

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

答案 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)