You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何自定义sinx()函数调用始终返回0?C语言泰勒级数实现问题

自定义泰勒级数实现sinx()返回0的问题排查

我基于泰勒级数实现了自定义的sinx()和cosx()函数,但调用sinx()时每次都返回0。以下是完整C语言代码,请求排查异常原因:

// homework 4, part 1,
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

// function call for factorial.
int factorial(int n) {
  int temp = n;
  int sum = 1;
  while (temp > 0) {
    sum *= temp;
    temp -= 1;
  }
  return sum;
}

// function call for numenator.
numenator(int n) {
  int numenator = pow(-1, n);
  return numenator;
}

// function call for powX.
powX(int x, int n) {
  int powX = pow(x, n);
  return powX;
}

// function call for x & n inputs.
/* function is not working */
int getInputs(int x, int n) {
  printf("Enter integer as degree: ");
  scanf(" %d", &x);
  printf("Enter integer as degree: ");
  scanf(" %d", &n);
  if (x == 'E' || n == 'E') {
    exit(EXIT_FAILURE);
  }
}

// function call to find sine.
double sinx(int x, int n) {
  double sine;
  double temp = 0.0;
  while (n > 0) {
    // program -n yapınca 2*n+1 değişiyor
    // temp üzerinden değişiklik yapınca, aynı döngü...
    // ...temp 0 olana kadar devam ediyor.
    sine = numenator(n) / factorial(2*n+1) * powX(x, 2*n+1);
    temp += sine;
    printf("sin(%d) where n is %d = %f\n", x, n, temp);
    n -= 1;
  }
}

// function call to find cosine.
double cosx(int x, int n) {
  double cosine = 0.0;
  double temp = 0.0;
  while (n > 0) {
    cosine = numenator(n) / factorial(2*n) * powX(x, 2*n);
    temp += cosine;
    n -= 1;
    printf("\ncos(%d) where n is %d = %f", x, n, temp);
  }
}

// main section of program.
int main() {
  int x = 30, n = 4;
  //getInputs(x, n);
  sinx(x, n);
  cosx(x, n);
  return 0;
}

问题原因分析

  • 整数除法导致结果归零:numenator(n)、factorial(2*n+1)都是int类型,它们的除法是整数除法。比如当n≥1时,factorial(2*n+1)的结果远大于numenator(n)的绝对值(仅为1),因此numenator(n)/factorial(...)的计算结果直接为0,后续乘以任何数最终都是0。需要将其中一个操作数转为浮点类型(比如(double)numenator(n)/factorial(2*n+1))再进行计算。
  • 泰勒级数参数应为弧度:当前代码传入的x是角度值(比如示例中的30),但泰勒级数的数学公式要求参数是弧度。需要先将角度转换为弧度,例如用x * M_PI / 180.0(编译时需链接math库,比如gcc加-lm参数)。
  • 函数缺少返回值:sinx()和cosx()声明为返回double类型,但函数末尾没有return语句,这会导致未定义行为,程序可能返回随机值或0。需要在函数末尾返回累加后的temp变量。
  • 子函数的类型错误:
    • numenator()和powX()没有指定返回类型(默认int),但pow()函数返回double类型,强制赋值给int会丢失精度甚至出错。这两个函数应该改为返回double类型。
    • powX()的实现完全多余,直接调用pow()即可,且传入的x应转为double类型避免整数溢出。
  • 阶乘函数溢出:当n≥5时,factorial(2*n+1)的结果会超出int的取值范围(int通常是32位,最大值约20亿),导致溢出错误。建议将factorial()的返回类型改为double,避免溢出。
  • getInputs函数逻辑错误:
    • 函数采用值传递,修改的是x和n的副本,不会影响main函数中的变量,需要改为指针传递(int getInputs(int *x, int *n))。
    • 判断x == 'E'是错误的,x是int类型,'E'是字符,无法匹配。应该通过检查scanf()的返回值来处理输入错误,比如输入非整数的情况。

内容的提问来源于stack exchange,提问作者yusufaktas23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:22:38