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

平方根近似计算器do/while循环无限无法返回正确值求助

平方根近似计算器无限循环问题解决

核心问题出在循环终止条件完全错误,这导致程序陷入死循环,同时还有几处细节错误影响结果输出,下面逐一说明并修复:

错误点拆解

  • 循环终止逻辑颠倒:你用new_guess > 0.005作为循环条件,意思是“只要近似值大于0.005就一直循环”。但牛顿迭代法的终止条件应该是两次迭代结果的差值小于精度阈值(比如0.00001),而不是近似值本身小于某个小数字。比如计算4的平方根,最终收敛到2,远大于0.005,所以循环永远停不下来。
  • 返回逻辑有漏洞:循环结束后判断new_guess < 0.005才处理返回,但这个条件根本不会触发(因为循环一直跑);如果输入的正数刚好让初始猜测值小于0.005,函数会没有返回值,触发未定义行为。
  • 输出格式错误:main函数里用%d输出double类型的结果,会导致输出乱码,应该用%f或%.2f。

修复后的完整代码

#include <stdio.h>
#include <math.h>
#include <stdlib.h> // 用于fabs函数

double square_root(double number, double last_guess) {
    // 先处理负数输入
    if (number < 0) {
        printf("输入不是正数。");
        return -1.0; // 返回错误标记
    }

    double new_guess;
    const double EPSILON = 1e-5; // 精度阈值,可按需调整,比如1e-5表示误差小于0.00001

    do {
        new_guess = 0.5 * (last_guess + number / last_guess);
        // 打印中间值用于调试,不需要可注释
        printf("当前近似值:%lf\n", last_guess);
        // 循环继续的条件:两次迭代的差值大于精度阈值
    } while (fabs(new_guess - last_guess) > EPSILON);

    // 保留两位小数后返回
    last_guess = roundf(last_guess * 100.0) / 100.0;
    return last_guess;
}

int main() {
    double number, last_guess;

    printf("请输入要求平方根的正数:");
    scanf("%lf", &number);

    printf("请输入初始猜测值:");
    scanf("%lf", &last_guess);

    double final_value = square_root(number, last_guess);

    // 用%.2f输出保留两位小数的结果
    printf("平方根近似值:%.2f\n", final_value);

    return 0;
}

关键修改说明

  1. 修正循环终止条件:用fabs(new_guess - last_guess) > EPSILON判断两次迭代的差值,当差值足够小时,说明近似值已经收敛,停止循环。
  2. 调整负数处理:提前拦截负数输入,直接返回错误标记,避免后续无效计算。
  3. 移除冗余判断:循环正常结束后直接处理返回值,确保函数在所有合法输入下都有明确的返回值。
  4. 修正输出格式:用%.2f输出double类型,保证结果正确显示。
  5. 添加精度常量:把EPSILON定义为常量,方便调整精度,代码可读性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 05:20:20