考试大纲知识点梳理, (1) 数学库常用函数
GESP C++七级考试大纲中共有4条考点,第1条考点要求我们熟练掌握数学库中的常用函数。在解决复杂的算法问题(如几何计算、概率统计、数值模拟)时,这些“轮子”能帮我们省去大量的造车时间。
(1)掌握数学库常用函数(三角、对数、指数),三角函数包括 sin(x),cos(x)等; 对数函数包括 log10(x):返回 x 以 10 为底的对数,log2(x):返回 x 以 2 为底的对数; 指数函数包括 exp(x):计算指数函数,返回 x 的以 e 为底的指数函数。 {: .prompt-info}
本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。 {: .prompt-warning}
在使用这些函数之前,别忘了引入头文件:
#include <cmath>
// 或者万能头文件
#include <bits/stdc++.h>⚠️ 注意:
<cmath>中的函数参数和返回值通常都是double类型(浮点数)。在涉及整数运算时要小心精度丢失问题,或者显式进行类型转换。 {: .prompt-danger}
一、三角函数 (Trigonometric Functions)
三角函数是几何计算的基础。在 C++ 中,最需要注意的一点是:所有三角函数的参数都是“弧度制” (Radians),而不是“角度制” (Degrees)。
1.1 常用函数表
| 函数 | 描述 | 数学公式 |
|---|---|---|
sin(x) | 正弦函数 | |
cos(x) | 余弦函数 | |
tan(x) | 正切函数 | |
asin(x) | 反正弦函数,返回弧度 | |
acos(x) | 反余弦函数,返回弧度 | |
atan(x) | 反正切函数,返回弧度 |
1.2 角度与弧度的转换
考试中给出的题目往往是角度(例如 30°, 90°),直接传给 python sin(30) 是错的!必须先转为弧度。
公式:
(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)
对数在算法复杂度分析(如 )和处理大数运算时非常有用。
2.1 常用函数表
| 函数 | 描述 | 数学公式 | 备注 |
|---|---|---|---|
log(x) | 自然对数,底数为 | 或 | 注意不是 |
log10(x) | 常用对数,底数为 10 | 或 | 考纲重点 |
log2(x) | 二进制对数,底数为 2 | 考纲重点,常用于计算完全二叉树高度 |
💡 小贴士:如果需要计算任意底数 的对数 ,可以使用换底公式:
{: .prompt-tip}
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) | 计算 的 次方 | |
pow(x, y) | 计算 的 次方 | |
sqrt(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的习惯。尤其是pow函数,计算整数次幂时,如果是很大的整数,建议自己写快速幂算法,因为double类型的pow可能会有精度误差导致WA(例如pow(5, 2)算出24.999999,转 int 变成 24)。 - 定义域错误:
sqrt(x)中 不能为负数。log(x)中 必须大于 0。asin(x)/acos(x)中 必须在 之间。- 这些错误通常会导致程序返回
NaN(Not a Number) 或运行时错误。
- 的写法:
acos(-1.0)是最稳健的写法,不要手打3.1415926,容易抄错且精度不够。
掌握了这些数学工具,你就在通往高级算法(如计算几何)的路上迈出了坚实的一步!
本文由coderli.com原创,按照CC BY-NC-SA 4.0 进行授权
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
“luogu-”系列题目可在 洛谷题库 在线评测。
“bcqm-”系列题目可在 编程启蒙题库 在线评测。
GESP/CSP认证交流QQ群: 688906745
