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 语言实现平方根计算,包括牛顿迭代法和二分查找法。
热门推荐
雕刻技巧之“鬼工球”
保温隔热技术在建筑节能中的应用
蒜头鼻怎么改善不整容
运动前多久喝咖啡燃脂效果最佳
生物多样性丧失:第六次大规模灭绝的解释
日本留学语言学习全攻略
不同类型的婚姻及其特点
如何培养亲密的母子关系:母亲在孩子成长中的关键作用
业内人士:联赛兴旺和国家队水平提升,举办世界大赛才水到渠成
电动车电池充电全攻略:类型、季节、操作一网打尽
非洲市场开发、非洲外贸海外营销指南
家庭常备外用药膏 家庭需常备哪些外用药?
“第谷体系”以研究行星运行著称,其成果与中国古天文学相较如何
多克隆抗体的制备与应用
用于极大口径望远镜系外行星探测的高对比度成像星冕仪技术
有史以来第一次:韦伯捕捉到太阳系外二氧化碳的直接图像
脚部皮肤破损出汗如何处理
甑皮岩遗址见证华南古人类生活智慧
污水处理厂废气处理方案工艺流程包括哪些?
萎缩性胃炎是怎么回事严重吗
郑州博物馆文化专题展:郑地名人、客家根亲、千年中医、豫声豫调
缓解肩颈疼痛,这些食物很重要!
2025年中国刀具材料市场分析:以硬质合金为主【组图】
6种食物希望你别错过 早餐吃什么养胃护胃
董永卖身葬父:二十四孝故事的感人篇章
万荣小淮村:董永故里德孝风
劳动纠纷投诉后如何处理
如何掌握白糖的价格行情?这些价格行情有怎样的变化趋势?
关于管辖权异议期限的相关法律规定及小结
中医名篇:药王孙思邈之《大医精诚》(原文+译文)