GESP C++ 七级考试大纲中的第一条考点,要求熟练掌握数学库中的常用函数。在解决复杂的算法问题(如几何计算、概率统计、数值模拟)时,这些现成的“轮子”能为我们节省大量重复造轮子的时间。
(1)掌握数学库常用函数(三角、对数、指数),三角函数包括 sin(x),cos(x)等; 对数函数包括 log10(x):返回 x 以 10 为底的对数,log2(x):返回 x 以 2 为底的对数; 指数函数包括 exp(x):计算指数函数,返回 x 的以 e 为底的指数函数。
在使用这些函数之前,必须引入对应的头文件:
#include <cmath>
// 或者使用万能头文件
#include <bits/stdc++.h>
注意:<cmath> 中的函数参数和返回值通常都是 double 类型(浮点数)。在涉及整数运算时要小心精度丢失问题,或者显式进行类型转换。
一、三角函数 (Trigonometric Functions)
三角函数是几何计算的基础。在 C++ 中,最需要注意的一点是:所有三角函数的参数都是“弧度制” (Radians),而不是“角度制” (Degrees)。
1.1 常用函数表
| 函数 |
描述 |
数学公式 |
sin(x) |
正弦函数 |
|
cos(x) |
余弦函数 |
|
tan(x) |
正切函数 |
|
asin(x) |
反正弦函数,返回弧度 |
|
acos(x) |
反余弦函数,返回弧度 |
|
atan(x) |
反正切函数,返回弧度 |
|
1.2 角度与弧度的转换
考试中给出的题目往往是角度(例如 30°, 90°),直接传给 C++ 的 sin(30) 是错的!必须先进行转换。
- 转换公式:
弧度 = 角度 × (π / 180)
- π (Pi) 的获取: 建议使用
acos(-1.0) 来获取高精度的 π 值。
1.3 代码示例
#include <iostream>
#include <cmath>
#include <iomanip> // 用于 setprecision
using namespace std;
int main() {
double pi = acos(-1.0); // 获取 pi
double angle = 60.0; // 60度
// 错误示范:直接传角度
cout << "sin(60) = " << sin(angle) << " (这是错的!)" << endl;
// 正确示范:转弧度
double radian = angle * (pi / 180.0);
cout << "sin(60°) = " << sin(radian) << endl; // 应该是 0.866...
cout << "cos(60°) = " << cos(radian) << endl; // 应该是 0.5
return 0;
}
二、对数函数 (Logarithmic Functions)
对数在算法复杂度分析(如大O表示法)和处理大数运算时非常有用。
2.1 常用函数表
| 函数 |
描述 |
数学公式 |
备注 |
log(x) |
自然对数,底数为 e |
ln(x) 或 log_e(x) |
注意不是 log10 |
log10(x) |
常用对数,底数为 10 |
log_10(x) 或 lg(x) |
考纲重点 |
log2(x) |
二进制对数,底数为 2 |
log_2(x) |
考纲重点,常用于计算完全二叉树高度 |
小贴士:如果需要计算任意底数 a 的对数 log_a(b),可以使用换底公式:
log_a(b) = log(b) / log(a)
2.2 代码示例
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double x = 100.0;
cout << "log10(100) = " << log10(x) << endl; // 输出 2
cout << "log2(8) = " << log2(8.0) << endl; // 输出 3
cout << "ln(e) = " << log(exp(1.0)) << endl; // 输出 1 (ln e = 1)
return 0;
}
三、指数函数 (Exponential Functions)
指数函数与对数函数互为逆运算,常用于计算幂次、根号等。
3.1 常用函数表
| 函数 |
描述 |
数学公式 |
exp(x) |
计算 e 的 x 次方 |
e^x |
pow(x, y) |
计算 x 的 y 次方 |
x^y |
sqrt(x) |
计算 x 的平方根 |
√x |
3.2 代码示例
#include <iostream>
#include <cmath>
using namespace std;
int main() {
// 1. exp(x)
cout << "e^1 = " << exp(1.0) << endl; // e 的近似值 2.71828...
// 2. pow(x, y) - 极其常用
cout << "2^10 = " << pow(2, 10) << endl; // 1024
cout << "3^3 = " << pow(3, 3) << endl; // 27
// 3. sqrt(x)
cout << "sqrt(16) = " << sqrt(16) << endl; // 4
// 勾股定理示例: c = sqrt(a^2 + b^2)
double a = 3.0, b = 4.0;
double c = sqrt(pow(a, 2) + pow(b, 2));
cout << "勾股数 3, 4 的斜边是: " << c << endl; // 5
return 0;
}
四、备考总结 & 易错点
对于 GESP 七级考生,掌握这些函数的使用只是第一步,更重要的是在实际题目中灵活运用并规避陷阱。
-
类型与精度陷阱:数学函数通常操作 double 类型。将整数传入时会发生隐式转换,但建议养成使用 double 的习惯。尤其是 pow 函数,计算整数次幂时,对于很大的整数或需要精确整数结果的情况,double 类型的 pow 可能会有精度误差导致 WA(例如 pow(5, 2) 算出 24.999999,转 int 后变成 24)。此时建议自己实现快速幂算法。
-
定义域错误:
sqrt(x) 中 x 不能为负数。
log(x) 中 x 必须大于 0。
asin(x) / acos(x) 中 x 必须在 [-1, 1] 之间。
- 这些错误通常会导致程序返回
NaN (Not a Number) 或运行时错误。
-
π 的写法:acos(-1.0) 是最稳健的写法,不要手打 3.1415926,容易出错且精度不足。
熟练掌握了这些数学工具,你就在通往更高级算法(如计算几何)的路上迈出了坚实的一步!如果你想深入探讨更多 C++ 或算法学习的技巧,欢迎在云栈社区与我们交流。