GESP 二级 第 08 讲:常用数学库函数

本讲定位二级的最后一讲,内容最轻松,但坑最密集。官方大纲把五个函数点了名——abs()sqrt()max()min()rand()/srand()——并要求”理解相应的算法原理”。这五个函数本身两分钟就能学会,真正要花时间的是它们的边界行为sqrt 的返回值是 doublemax 的两个参数类型必须一致、rand 不设种子每次结果都一样。这些坑在客观题里是送命题,在编程题里是隐形失分。

对应官方大纲:二级知识块 8「数学函数」——绝对值函数 abs()、平方根函数 sqrt()、最大值函数 max()、最小值函数 min()、随机数函数 rand()/srand() 及相关。

前置知识:一级第 04 讲(数据类型)、二级第 05 讲(类型转换——本讲一半的坑都源于类型)。

代码说明:本讲所有代码均已用 g++ 11.5(-std=c++11)编译运行验证,输出结果即为文中标注结果。


1. 先看两道真题

第一道(单选)

下列语句中,会导致编译错误的是( ) A. cout << max(3, 7); B. cout << sqrt(16.0); C. int a = 1; double b = 2.0; cout << max(a, b); D. cout << abs(-5);

第二道(判断)

在没有调用 srand() 的情况下,程序每次运行时 rand() 产生的随机数序列是不同的。( )

答案:第一道选 C,第二道错误。

这两道题就是本讲的两大坑区:类型随机数种子


2. 头文件:先搞清楚谁在哪

函数 头文件 备注
abs(整数) <cstdlib> C++11 起 <cmath> 也提供
fabs(浮点) <cmath>
sqrtpowfloorceilround <cmath>
maxmin <algorithm> ⚠️ 不在 <cmath>
randsrandRAND_MAX <cstdlib>
time(配合 srand 用) <ctime>

💡 省事的做法:把常用的几个一次性写全。本课程推荐的二级标准头

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;

⚠️ 最容易漏的是 <algorithm>——学生用 max 时常忘记它,报错信息是 'max' was not declared in this scope。看到这个报错,第一反应就是补 <algorithm>

📌 竞赛里常用 #include <bits/stdc++.h> 一次性包含全部,但它不是标准写法,某些编译器不支持。GESP 考场用 Dev-C++(g++)通常可用,但本课程仍建议逐个写清楚。


3. 绝对值:absfabs

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;

int main() {
    cout << abs(-7) << " ";
    cout << fabs(-7.5) << " ";
    cout << abs(-7.5) << endl;
    return 0;
}

输出:

7 7.5 7.5
函数 用于 返回
abs(x) 整数 整数
fabs(x) 浮点数 double