C++平方根函数 sqrt
中等24C++平方根函数 sqrt:从正方形边长到生活中的各种计算
什么是平方根?为什么编程时要用到它?
平方根就是“谁的平方等于这个数?”的答案。比如,你知道一个正方形的面积是 25,求边长。因为边长 × 边长 = 面积,所以边长 = √25 = 5。在 C++ 里,计算平方根就靠 sqrt 函数。
生活中还有很多地方用到平方根:
- 知道直角三角形的两条直角边,求斜边(勾股定理)
- 计算物体下落的时间(物理公式 h = ½gt² 变形)
- 游戏中人物到目标的距离(根据坐标计算)
- 考试成绩标准化时计算标准差(需要先算平方根)
sqrt 是 "square root" 的缩写,它接受一个数字(通常是小数),返回它的平方根(也是小数)。任何非负数都可以求平方根,负数会出错。
使用 sqrt 前的准备
1. 必须包含头文件
sqrt 定义在 <cmath> 头文件里(C语言中是 <math.h>,但 C++ 推荐用 <cmath>)。就像用 cout 要 #include <iostream>,用 sqrt 也要先告诉编译器去哪里找它。
#include <cmath> // 有了它才能用 sqrt
2. 参数和返回值的类型
sqrt 的参数和返回值都是 double 类型(双精度浮点数)。double 可以表示很大或很小的数,精度比 float 更高。
如果你传入一个整数(比如 25),C++ 会自动把它转换成 double,结果依然是 double。
double result = sqrt(25); // 正确,result 得到 5.0
double result2 = sqrt(2.0); // 正确,得到约 1.414213562
第一个例子:正方形面积求边长
这是最经典的入门用法。假设你有一个正方形花坛,面积是 25 平方米,想知道边长是多少。
#include <iostream>
#include <cmath> // 引入 sqrt 函数
using namespace std;
int main() {
double area = 25.0; // 面积 25 平方米
double side = sqrt(area); // 边长 = 平方根
cout << "面积: " << area << endl;
cout << "边长: " << side << " 米" << endl;
return 0;
}
运行结果:
面积: 25
边长: 5 米
你也可以把面积换成其他值来试试:sqrt(16) 返回 4.0,sqrt(2) 返回约 1.414213562。
更多生活中的例子(带完整代码)
例1:用勾股定理求斜边长度
小明每天从家到学校,先向东走 3 公里,再向北走 4 公里。他如果直接走直线,距离是多少?根据勾股定理:斜边 = √(3² + 4²) = √(9+16) = √25 = 5。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double a = 3.0; // 第一条直角边(公里)
double b = 4.0; // 第二条直角边(公里)
double c = sqrt(a*a + b*b); // 斜边 = 平方根( a² + b² )
cout << "直接距离: " << c << " 公里" << endl;
return 0;
}
输出:直接距离: 5 公里
例2:已知圆的面积求半径
圆的面积公式是 S = πr²,所以半径 r = √(S / π)。假如一个圆形的草坪面积是 78.5 平方米,问半径。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double pi = 3.1415926535; // 圆周率
double area = 78.5; // 面积
double radius = sqrt(area / pi); // 半径 = 平方根(面积/π)
cout << "半径 ≈ " << radius << " 米" << endl;
return 0;
}
输出:半径 ≈ 5 米(因为 5²×3.14 ≈ 78.5)
新手容易犯的错误
❌ 错误1:忘记包含头文件
#include <iostream>
using namespace std;
int main() {
double x = sqrt(16); // ❌ 错误!没有 #include <cmath>
return 0;
}
编译器会报错:"sqrt was not declared in this scope"。解决方法:在开头加上 #include <cmath>。
❌ 错误2:对负数求平方根
double y = sqrt(-9); // ❌ 错误!负数不能开平方
程序不会直接崩溃,但会得到一个特殊值 "NaN"(Not a Number)。后续计算可能全乱套。所以传给 sqrt 的参数一定要保证 ≥ 0。
❌ 错误3:把结果赋给 int 变量,丢失小数
int side = sqrt(10); // sqrt(10) ≈ 3.162,赋给 int 变成 3
丢失的小数部分可能造成后续计算偏差。除非你确定只需要整数部分(比如求正方形的最大整数边长),否则建议用 double 类型变量保存结果。
❌ 错误4:忘记参数类型转换
sqrt 能直接接受 int,没问题。但如果你传入 float,返回值是 double,一般也没问题。但注意,如果传入 int 表达式时注意计算顺序:
double result = sqrt(1/4); // ❌ 1/4 在整数除法中结果是 0,sqrt(0)=0
// 正确写法:sqrt(1.0/4) 或 sqrt(1/4.0)
❌ 错误5:误以为 sqrt 能计算任意次方根
sqrt 只算平方根。如果想算立方根(例如 8 的立方根是 2),应该用 pow 函数:pow(8, 1.0/3)。
完整且规范的示例:计算考试分数的标准差
标准差能反映一组分数的离散程度,计算时需要先求方差,再开平方。假设三个同学的数学成绩:80, 90, 100。
#include <iostream>
#include <cmath> // 用 sqrt
using namespace std;
int main() {
double score1 = 80.0; // 第1个分数
double score2 = 90.0; // 第2个分数
double score3 = 100.0; // 第3个分数
double n = 3.0; // 人数
double mean = (score1 + score2 + score3) / n; // 平均分
// 方差 = ( (x1-平均数)² + (x2-平均数)² + (x3-平均数)² ) / n
double variance = ( (score1-mean)*(score1-mean) +
(score2-mean)*(score2-mean) +
(score3-mean)*(score3-mean) ) / n;
double stddev = sqrt(variance); // 标准差 = 方差的平方根
cout << "平均分: " << mean << endl;
cout << "标准差: " << stddev << endl;
return 0;
}
运行结果:
平均分: 90
标准差: 8.16497
相关知识点指引
学完 sqrt 后,可以继续探索 C++ 中的其他数学函数:
- 幂函数
pow:计算任意次方,比如pow(2, 3)得 8。 - 绝对值函数
fabs:对浮点数取绝对值,fabs(-3.5)得 3.5。 - 三角函数:
sin,cos,tan等,需要弧度制。 - 取整函数:
floor(向下取整)、ceil(向上取整)、round(四舍五入)。 - 对数函数:
log(自然对数)、log10(以10为底)。
这些函数都声明在 <cmath> 中,用法都和 sqrt 类似——传入一个 double 参数,返回 double 结果。如果你对数学计算感兴趣,不妨把它们都试试!
小总结:
sqrt是编程计算平方根的利器,记住三点——加头文件、参数非负、结果用double存。从正方形边长到物理公式,用好它能让你的程序解决更多实际问题。
例题精讲
在C++中,要使用sqrt函数计算一个数的平方根,需要包含哪个头文件?
在C++中,sqrt(-4)会返回一个负数。
以下程序计算正方形的边长,已知面积area,请补充代码:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double area = 25.0;
double side = ___(___)___;
cout << "The side length is: " << side << endl;
return 0;
}已知一个正方形的面积是49,使用sqrt函数计算其边长,下列输出结果正确的是?
请完善以下程序,计算一个数的平方根并输出:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double num = 16.0;
double result = sqrt(num);
cout << "The square root is: " << ___ << endl;
return 0;
}