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

计算级数1-X²/2!+X⁴/4!-…时为何任意输入输出均为-1.00?

问题原因分析及修复方案

你的代码输出始终为-1.00,核心问题出在变量类型选择错误和整数运算的截断特性上,具体问题点如下:

  • 整数类型无法承载浮点运算结果

    1. p 被定义为 int,但pow(x,z)返回的是double类型值。当赋值给int时,小数部分会被直接截断,且当计算结果超出int范围时会发生溢出,导致p的值完全错误。
    2. fact 是int类型,阶乘增长速度极快(比如8!就已经是40320,13!会超过32位int的最大值2147483647),溢出后fact会变成负数或0,直接破坏后续的除法运算。
    3. k 被定义为int,s*p/fact是整数除法——只要分子小于分母,结果就会被截断为0,导致后续项无法正确累加到sum中;如果分子是负数且绝对值大于分母,会得到错误的整数结果(比如-4/2=-2,直接让初始sum=1变成-1,后续项又都是0,最终输出-1.00)。
  • 循环内的阶乘计算逻辑易混淆
    虽然fact = fact*2*i*(2*i-1);的运算结果是对的,但运算符优先级容易让人误解,建议明确加上括号:fact = fact * (2*i) * (2*i - 1);,提升可读性。


修复后的代码

把所有参与浮点运算的变量改成double类型,避免整数截断和溢出问题:

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

int main() {
    int n;
    double x; // 改为double,支持小数输入,也避免pow的类型转换问题
    printf("enter base: ");
    scanf("%lf", &x);
    printf("number of terms: ");
    scanf("%d", &n);

    double sum = 1.0;
    double fact = 1.0; // 用double存储阶乘,避免溢出
    int s = 1;
    double p = 1.0; // 用double存储幂运算结果

    for(int i = 1; i <= n; i++) {
        s *= -1;
        int z = 2 * i;
        p = pow(x, z);
        fact *= (2*i) * (2*i - 1); // 明确括号,计算当前阶乘增量
        double k = s * p / fact; // 用double存储项的值
        sum += k;
    }
    printf("the sum is : %.2f", sum);
    return 0;
}

额外优化建议

  1. 不需要单独计算pow(x,z),可以利用前一项的结果递推:比如第i项的幂是前一项的幂乘以x*x,这样避免调用pow函数,提升效率和精度。
  2. 阶乘也可以通过递推优化,但用double存储已经足够应对大部分场景。

内容的提问来源于stack exchange,提问作者ARPIT KUMAR SATAPATHY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:10:36