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

使用沃利斯公式求PI的C语言程序输出-inf问题排查

解决沃利斯公式计算PI时输出“-inf”的问题

问题原因

核心问题是整数溢出:

  • 代码中分母(2*i-1)*(2*i+1)的两个操作数都是long int类型,当i增大到约1e5以上时,两者的乘积会超过32位long int的最大值(约2147483647),触发整数溢出,结果变为负数。
  • 负数参与计算后,term会变成负值,sum在多次相乘后符号反复变化,最终因数值异常导致pi输出-inf。
  • 额外问题:使用pow((2*i),2)计算平方既没必要,还可能引入不必要的浮点运算开销。

修正后的代码

#include<stdio.h>

int main()
{
    long int i;
    double sum = 1.0, term, pi = 0.0;
    /* 应用沃利斯公式 */
    for(i = 1; i < 1000000; i++)
    {
        double even = 2.0 * i;
        double odd1 = even - 1.0;
        double odd2 = even + 1.0;
        term = (even * even) / (odd1 * odd2);
        sum *= term;
    }
    pi = 2.0 * sum;
    printf("PI = %.10lf\n", pi);
    return 0;
}

修改说明

  • 强制浮点运算:将2*i转换为double类型后再计算分母,确保所有乘法操作在浮点域进行,彻底避免整数溢出。
  • 替换pow函数:用even * even直接计算平方,既提升计算效率,也避免了浮点函数可能带来的精度偏差。
  • 明确浮点初始化:将sum和pi初始化为1.0、0.0,避免隐式类型转换引发的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 06:35:32