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 语言实现平方根计算,包括牛顿迭代法和二分查找法。
热门推荐
数十个市集扎堆迎新,城市市集是新潮流还是伪需求?
《黑神话:悟空》游戏+CG用了哪些技术支持?
一文带你读懂最近很火的DeFi到底是什么?
ppr和pe管的区别对比与实际应用场景
15种“喜阴花”,光线差也能“开爆盆”,养在阳台客厅超有范
男子捡到22万归还失主遭讹诈 法院判决失主败诉
如何选择合适的壁挂炉设置?这些设置如何提升供暖效果?
中科院上海微系统所Nature+1:用于二维集成电路的单晶栅介质!
强直性脊柱炎患者如何拉伸上半身
这些人为什么拥有了“超能力”
阿特兹的前悬架和后悬架类型是什么
儿童"迷你厨房"玩具安全隐患重重,多地已发消费警示
地铁13号线“建材城东站”进展缓慢?官方回复了…
公积金利率降了为啥每个月还的钱还跟以前一样?真相揭秘
电脑小白必看:如何快速找到你的打印机扫描件存储位置
标普消费ETF爆炒!景顺长城的无奈与短板
照片文件管理指南:四种实用方法助你轻松整理照片
手抖需要治疗吗?
膝关节纤维瘤手术是否为大手术?专业医生详解
个税计算器反推税前:如何轻松计算税前收入?
“美国在粮食安全上的砝码少了,中国安心了”
自由泳换气技巧详解(以一次换气四次划手为例)
查看显卡的几种方式?
水稻生长的关键助力!微量元素在水稻生长过程中起什么作用?
常见的TTL电路有哪些?如何处理TTL电路多余的输入端?
小区电梯问题投诉指南及使用常识
宝宝舌系带过短,剪还是不剪?做手术的最佳年龄?
新疆焦炭行业分析
常见的TTL电路有哪些?如何处理TTL电路多余的输入端?
洗碗机底排水清洗方法(轻松解决洗碗机底部排水问题)