【问题标题】:Taylor expansion of function, f(x)=sin(x)+cos(x) in C programming has an output error. Any suggestions?函数的泰勒展开,C 编程中的 f(x)=sin(x)+cos(x) 有输出错误。有什么建议?
【发布时间】:2015-01-07 23:49:47
【问题描述】:

我是编程新手。我的 uni 课程包含一个编程模块 (C),我需要一些帮助来弄清楚我的代码发生了什么。

对于 sin(x) 我有:

#include <stdio.h>
#include <math.h>
/*Taylor series expansion of sin(x)*/
int main(void)
{
    float x, ans;
    int i, fac, n, sign;

    printf("Value for x: ");
    scanf("%f", &x);

    printf("Value for n: ");
    scanf("%d", &n);

    for (i=1, fac=1, ans=x, sign=-1; i<=n; i++)
        {
        fac*=(2*i+1)*2*i;
        ans+=sign*pow(x,2*i+1)/fac;
        sign*=-1;
        }

    printf("Answer is %f.\n", ans); /*Taylor expansion completed*/

    return 0;
}

我现在(在帮助下)修复了 sin(x) 的扩展。但是对于完整的问题,我很难做对。

到目前为止,我对 f(x)=sin(x)+cos(x) 的扩展如下所示:

#include <stdio.h>
#include <math.h>

int main(void)
{
    int x, sin, cos;
    float i, j, fac1, fac2, n, sign, ans;

    printf("Value for x: ");
    scanf("%f", &x);

    printf("Value for n: ");
    scanf("%d", &n);

    for (i=1, fac1=1, fac2=1, sin=x, cos=1, ans=1+x, sign; i<=n; i++)
    {
        fac1*=(2*i+1)*2*i; /*factorial expansion for sin(x)*/
        fac2*=2*i*(2*i-1); /*factorial expansion for cos(x)*/
        sin+=sign*pow(x,2*i+1)/fac1; /*Series expansion of sin(x)*/
        cos+=sign*pow(x,2*i)/fac2; /*Series expansion of cos(x)*/
        sign*=-1;
        ans=sin+cos; /*Final step*/
    }

    printf("Answer is %f.\n", ans); /*Taylor expansion completed*/

    return 0;
}

我认为这会起作用,但例如插入 1 和 10 会得到 1065353216(基本上是错误的)。对这个有什么建议吗?

【问题讨论】:

  • 必须经常检查scanf的返回值;你不知道它是否失败。
  • 您期望输出是什么?当你输入 5 和 5 时?
  • “不是我想象的那样”是什么意思?结果有点不准确?结果严重错误?编译错误?运行时错误?请更具体。
  • 编译所有警告和调试信息(例如,gcc -Wall -Wextra -g,如果使用GCC)。然后学习如何使用调试器(例如gdb),尤其是逐步运行您的程序。阅读floating-point-gui.de
  • 不要使用浮点类型作为循环变量或索引。 (in 应该是整数类型)

标签: c math taylor-series


【解决方案1】:

展开式的分子中应该有 (-1)i。你应该使用int i,因为它是一个循环变量,否则会违反约定。

a = a + (pow(-1,i) * pow(x, (2 * i) + 1)) / f; /* Expansion sum */

replace pow(-1, i)(i &amp; 1 ? -1 : 1),其中iint

【讨论】:

  • 应该是 (-1)^i。幂的优先级高于否定
  • 感谢您的帮助。忘了这样做。
  • 注意i 是浮点类型。对于循环索引或模运算/bitfidlling 不是很有用。
  • @LưuVĩnhPhúc 谢谢 x2
  • @rpattiso 你不能使用-(i &amp; 1)。我忘了它返回 1 和 0 而不是 -1
【解决方案2】:
#include <stdio.h>
#include <math.h>

int main(void){
    float x, a, f;
    int i, n, sign;

    printf("Value for x: ");
    scanf("%f", &x);

    printf("Value for n: ");
    scanf("%d", &n);

    for (i=1, f=1.0, a=x, sign=-1; i<=n; i++){
        f *= (2*i+1)*2*i;
        a += sign * pow(x, 2.0*i+1) / f;
        sign *= -1;
    }

    printf("Answer is %f.\n", a); /*Taylor expansion completed*/

    return 0;
}

【讨论】:

  • “标志”是什么意思?
  • @KristopherRahimAfful-Brown -11
  • 谢谢。现在我不知道 '+=' 和 '*=' 是做什么的。
  • @KristopherRahimAfful-Brown (2k+1)! = (2k+1) * (2k) * (2(k-1)+1)!, f*=2*i*(2*i+1);
  • 在代码中包含一些文本会很有帮助。
猜你喜欢
  • 2022-06-10
  • 2016-02-01
  • 2015-04-30
  • 2018-06-23
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-19
相关资源
最近更新 更多