繁体   English   中英

处理代码以阶乘和计算余弦

[英]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;
}

编辑

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

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM