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

Antiphon公式计算π时大参数数值异常问题求助

问题原因分析

  • 递归方向导致误差放大:原代码从外层(k=1)开始递归计算内层结果,每一层sqrt的微小误差都会被后续的嵌套运算不断放大。当t≥25时,误差累积到足以让结果偏离正常范围,出现大数;当t≥29时,误差导致递归计算出的rec(1,t)趋近于0,再乘以指数增长的pow(2,t)后下溢为0。
  • pow(2,t)的精度与溢出问题:double类型的指数运算pow(2,t)在t较大时,会快速接近甚至超出double的有效精度范围,进一步加剧计算误差,最终引发数值溢出或下溢。

修复方案

核心思路是从内向外迭代计算,避免递归的误差放大,同时用迭代乘法替代指数运算减少精度损失:

修复后的代码

double antiphon_pi(int t) {
    double res = 0.0;
    // 从最内层开始迭代,逐步向外推导
    for (int k = t; k >= 1; k--) {
        res = sqrt(k == 1 ? (2 - res) : (2 + res));
    }
    // 用循环累积乘法替代pow(2,t),避免精度损失
    for (int i = 0; i < t; i++) {
        res *= 2;
    }
    return res;
}

int main() {
    setlocale(LC_ALL, "Russian");
    int t;
    scanf_s("%d", &t);
    double pi = antiphon_pi(t);
    printf("%.6f", pi);
    return 0;
}

修复要点

  1. 迭代计算顺序调整:从k=t(最内层)开始,逐步计算到k=1,每一步都基于前一步的准确结果,误差只会逐步累积而非被放大,有效控制精度损失。
  2. 替换pow(2,t):用循环逐次乘以2替代指数运算,避免pow函数在大指数下的精度偏差,同时降低溢出风险。

测试结果:修复后输入25-28会输出接近3.14159的近似值,输入29及以上也会稳定输出π的近似值,不会出现大数或0的异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:38:18