/********************************************************************
* C 语言实现平方根(开方)计算
*
* 方法:
* 1. 牛顿迭代法
* 2. 二分查找法
*
* 编译:
* gcc -o sqrt_calc sqrt_calc.c -lm
* 运行:
* ./sqrt_calc
********************************************************************/
#include <stdio.h>
#include <math.h>
/* ---------------------- 牛顿迭代法计算平方根 ---------------------- */
/*
* 函数:sqrt_newton
* 功能:使用牛顿迭代法计算平方根
* 参数:
* x - 需要计算平方根的数
* 返回:
* sqrt(x) 的近似值
*/
double sqrt_newton(double x) {
if (x < 0) return -1; // 负数没有实数平方根
if (x == 0) return 0;
double y = x / 2.0; // 初始猜测值
double epsilon = 1e-6; // 计算精度
while (fabs(y * y - x) > epsilon) {
y = 0.5 * (y + x / y); // 迭代计算
}
return y;
}
/* ---------------------- 二分查找法计算平方根 ---------------------- */
/*
* 函数:sqrt_binary_search
* 功能:使用二分查找法计算平方根
* 参数:
* x - 需要计算平方根的数
* 返回:
* sqrt(x) 的近似值
*/
double sqrt_binary_search(double x) {
if (x < 0) return -1; // 负数没有平方根
if (x == 0) return 0;
double left = (x < 1) ? x : 0; // 适用于 0<x<1 的情况
double right = (x < 1) ? 1 : x;
double mid;
double epsilon = 1e-6; // 计算精度
while (right - left > epsilon) {
mid = (left + right) / 2.0;
if (mid * mid > x) {
right = mid;
} else {
left = mid;
}
}
return (left + right) / 2.0; // 取中间值
}
/* ---------------------- 主函数 ---------------------- */
int main() {
double num;
// 输入需要开方的数
printf("请输入一个非负数:");
scanf("%lf", &num);
// 使用牛顿迭代法计算平方根
double sqrt1 = sqrt_newton(num);
printf("牛顿迭代法计算 sqrt(%.6f) = %.6f\n", num, sqrt1);
// 使用二分查找法计算平方根
double sqrt2 = sqrt_binary_search(num);
printf("二分查找法计算 sqrt(%.6f) = %.6f\n", num, sqrt2);
// 使用标准库 sqrt() 计算平方根
double sqrt3 = sqrt(num);
printf("标准库 sqrt(%.6f) = %.6f\n", num, sqrt3);
return 0;
}
|