平方根近似计算器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; }
关键修改说明
- 修正循环终止条件:用
fabs(new_guess - last_guess) > EPSILON判断两次迭代的差值,当差值足够小时,说明近似值已经收敛,停止循环。 - 调整负数处理:提前拦截负数输入,直接返回错误标记,避免后续无效计算。
- 移除冗余判断:循环正常结束后直接处理返回值,确保函数在所有合法输入下都有明确的返回值。
- 修正输出格式:用
%.2f输出double类型,保证结果正确显示。 - 添加精度常量:把EPSILON定义为常量,方便调整精度,代码可读性更高。
内容的提问来源于stack exchange,提问作者Veddersboy
相关产品推荐
相关产品推荐

