为何自定义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()的返回值来处理输入错误,比如输入非整数的情况。
- 函数采用值传递,修改的是x和n的副本,不会影响main函数中的变量,需要改为指针传递(
内容的提问来源于stack exchange,提问作者yusufaktas23
相关产品推荐
相关产品推荐

