GESP 八级 · GESP 202509 C++ 八级 第 20 题

判断题 · 答案 B · 考点:数学

← 整套速查表 GESP 八级 全部真题

题目

使用 math.h 或 cmath 头文件中的函数,对于 int 类型的变量 $x$,表达式 fabs(x) 和 sqrt(x * x) 的结果总是近似相等的。

答案:B

考点

数学

解题思维

仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。

常见错误

审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。

详细解析(节选)

【考点】整数溢出|浮点运算|数学库函数

本题考查《GESP 大纲》八级"C++ 基础”模块中整数类型范围与数学库函数用法。命题人专门设计此题,就是要卡住考生对 int 类型最大值的认知盲区——以为√(x²)=|x|永远成立,却忽略了中间计算 x*x 可能溢出。

解题时先识别数学本质:fabs(x) 是绝对值,sqrt(x*x) 是平方根。再看数据类型:x 是 int,x*x 是整数乘法。当 x 接近 2³¹ 时,x*x 会超出 int 范围,发生溢出。而 C++ 中整数溢出是未定义行为,结果完全不可预测。因此两者不可能"总是"相等。

陷阱一:把数学公式当成代码逻辑,忘记数据范围。陷阱二:忽略中间表达式 x*x 的类型,以为 sqrt 会自动处理。陷阱三:认为 fabs 和 sqrt 是纯数学函数,实际调用时受限于变量类型。

若把 int 换成 long long,答案不变;若把 int 换成 float,则 x*x 自动转为浮点,不再溢出,答案变正确。刷到此类题,先问自己:变量类型是什么?中间计算会不会溢出?

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断