打印
[生态工具]

C语言实现开方数

[复制链接]
76|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mikewalpole|  楼主 | 2025-7-25 23:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/********************************************************************
* 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;
}


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

1688

帖子

0

粉丝