mikewalpole 发表于 2025-7-25 23:33

C语言实现开方数

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

页: [1]
查看完整版本: C语言实现开方数