使用 math.h 或 cmath 头文件中的函数,对于 int 类型的变量 $x$,表达式 fabs(x) 和 sqrt(x * x) 的结果总是近似相等的。
仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】整数溢出|浮点运算|数学库函数
本题考查《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 自动转为浮点,不再溢出,答案变正确。刷到此类题,先问自己:变量类型是什么?中间计算会不会溢出?