C语言实现开方数(附带源码)
创作时间:
作者:
@小白创作中心
C语言实现开方数(附带源码)
引用
CSDN
1.
https://blog.csdn.net/m0_61840987/article/details/145440110
C 语言实现平方根(开方)计算
一、项目背景与概述
1. 什么是平方根?
平方根(Square Root)是指对于一个非负数 x,找到一个数 y 使得:
y^2 = x
即:
在数学计算和工程应用中,计算平方根是一个常见操作,例如:
- 计算几何(如计算三角形的斜边)
- 物理学(计算速度、加速度等公式)
- 统计学(计算标准差)
- 机器学习(计算欧几里得距离)
2. 计算平方根的常见方法
- 标准库方法:C 语言
math.h
提供了
sqrt(x)
,直接计算平方根。 - 牛顿迭代法(Newton's Method):利用迭代逼近法快速求解平方根。
- 二分查找法:适用于数值分析,适合精度可控的计算场景。
- 移位法(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 语言实现平方根计算,包括牛顿迭代法和二分查找法。
热门推荐
秦史中的异常天象与重要事件:彗星连续出现最高达80天
训练过程中出现NaN怎么办?
如何根据木工锯片参数正确选择锯片
在线高频交易股票预测:自动化特征聚类与径向基函数神经网络
集齐“七龙珠”能召唤什么?“七星连珠”即将出现!
怎样检查宝宝是不是乳糖不耐受
股东如何注入资金到公司公户
20 岁的日本混血球员,甩开了亚洲同龄人
石油需求上升的原因是什么?这种需求变化对市场有什么影响?
如何收集证据证明违法裁员
皮炎湿疹的激素药物
湿疹吃什么药最管用?介绍几种常见的药物
任正非:英语是工作语言,华为出海时这样练英语
有限责任公司改制为股份有限公司应具备什么条件
股份公司变更为有限公司流程
离职后,能提取武汉公积金全部余额吗?
如何加热披萨?吃披萨时搭配哪些食物?
股票挂单全攻略:时间选择与技巧运用
交管12123如何解绑车辆
从顶流到无人问津,门店倒闭上千家!风靡一时的酸菜鱼为何没落?
如何有效制定项目实施推广计划?掌握这五个关键步骤!
租房三大法律问题详解:房产证、维修责任与押金退还
从乡村小学到DeepSeek创始人:梁文峰的成长之路
校招合同违约金合法吗
盆景换盆的最佳时间(如何在正确的时间为盆景换盆)
肺气肿患者饮食指南:这些食物要少吃,这些食物要多吃
【葡萄牙美食攻略】里斯本、波多必吃特色料理、好吃餐厅推荐
《生命之书:365天的静心冥想》:每日冥想引领心灵成长的年度指南
国际法的新挑战与机遇:探索全球化的多维视角
锥体外系反应的处理方法