- /********************************************************************
- * 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;
- }
|