问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言实现开方数(附带源码)

创作时间:
作者:
@小白创作中心

C语言实现开方数(附带源码)

引用
CSDN
1.
https://blog.csdn.net/m0_61840987/article/details/145440110

C 语言实现平方根(开方)计算

一、项目背景与概述

1. 什么是平方根?

平方根(Square Root)是指对于一个非负数 x,找到一个数 y 使得:
y^2 = x
即:
在数学计算和工程应用中,计算平方根是一个常见操作,例如:

  • 计算几何(如计算三角形的斜边)
  • 物理学(计算速度、加速度等公式)
  • 统计学(计算标准差)
  • 机器学习(计算欧几里得距离)

2. 计算平方根的常见方法

  1. 标准库方法:C 语言
    math.h
    提供了
    sqrt(x)
    ,直接计算平方根。
  2. 牛顿迭代法(Newton's Method):利用迭代逼近法快速求解平方根。
  3. 二分查找法:适用于数值分析,适合精度可控的计算场景。
  4. 移位法(Bitwise Approximation):适用于低层次嵌入式系统,高效计算平方根。

本文主要实现:

  • 使用牛顿迭代法计算平方根(高效且易实现)。
  • 使用二分查找法计算平方根(适用于非负数)。

二、项目实现思路

方法 1:牛顿迭代法

牛顿法是求解非线性方程:
的一个数值逼近方法,使用公式:

  • 初始值:取
    y0 = x / 2
  • 迭代计算直到
    |y_n^2 - x|
    小于设定精度
    ε

方法 2:二分查找法

  • 设定范围
    [0, x]
    ,如果
    x < 1
    设定为
    [x, 1]

  • mid = (left + right) / 2
    ,计算
    mid^2

  • mid^2 ≈ x
    ,则
    mid
    为平方根。

  • mid^2 < x
    ,说明平方根在右半部分
    left = mid

  • mid^2 > x
    ,说明平方根在左半部分
    right = mid
  • 继续二分,直到
    |mid^2 - x|
    小于精度
    ε

三、完整代码(附详细注释)

/********************************************************************
 * 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.

sqrt_newton()
**

  • 作用:使用牛顿迭代法计算平方根。
  • 输入
  • x
    :需要求平方根的数。
  • 核心逻辑
  • 初始猜测值
    y = x / 2.0
  • 不断迭代
    y = 0.5 * (y + x / y)
    直到满足
    |y^2 - x| < ε
  • 时间复杂度O(log n)

**2.

sqrt_binary_search()
**

  • 作用:使用二分查找法计算平方根。
  • 输入
  • x
    :需要求平方根的数。
  • 核心逻辑
  • 范围设定
    [0, x]
    (如果
    x < 1

    [x, 1]
    )。
  • 不断二分
    mid = (left + right) / 2
    直到满足
    |mid^2 - x| < ε
  • 时间复杂度O(log n)

**3.

main()
**

  • 作用
  • 读取用户输入的
    x
  • 调用
    sqrt_newton()
    计算并打印结果。
  • 调用
    sqrt_binary_search()
    计算并打印结果。
  • 调用
    sqrt()
    (标准库)进行对比。

五、示例运行结果

请输入一个非负数:9
牛顿迭代法计算 sqrt(9.000000) = 3.000000
二分查找法计算 sqrt(9.000000) = 3.000000
标准库 sqrt(9.000000) = 3.000000

六、项目总结

  • 牛顿迭代法:收敛速度快,适用于高精度计算
  • 二分查找法:简单易实现,适用于通用场景
  • 标准库
    sqrt()
    :是最优化的实现
    ,推荐直接使用。

优化方向

  • 支持负数的复数开方计算
  • 改进牛顿法,使用更好的初始值提升收敛速度。

七、结语

本文介绍了C 语言实现平方根计算,包括牛顿迭代法二分查找法

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号