C++ 表达式 (sqrt(N) * sqrt(N)) == N 中的 $N$ 如果为正整数,则表达式的值为 true,相当于开平方后平方是本身。( )
答案B。根据C++基础知识分析判断。
注意题目中的限定词。不确定时用代入法或排除法。
【考点】浮点精度|sqrt函数|相等判断
GESP二级"数据存储"模块,命题人考的是"浮点型"的本质缺陷——计算机无法精确表示所有实数,sqrt返回double,乘回N会因精度丢失产生微小误差(如32开方平方得31.999999999999996),所以直接==必然失败。
看到"开平方再平方"先想浮点误差,关键观察是N越大误差越明显。推理链:sqrt(N)返回double → 乘法运算存在舍入 → 结果与N比较必然有微小偏差。通法是:涉及浮点运算的比较,永远不要用==,必须用abs(a-b)<eps或round()。
陷阱是"整数运算"的惯性思维——考生默认sqrt(N)*sqrt(N)一定等于N,忽略了sqrt返回的是double。最阴险的细节是N=32这类"看起来完美"的数,实际平方后只有15位有效数字,第16位已丢失。背结论会掉进"==成立"的坑,理解IEEE 754才知道误差必然存在。
命题人若把N换成12345678901234567890,答案不变;若改成sprintf("%.18f", sqrt(N)*sqrt(N))输出,能直观看到误差。刷到类似题先问"命题人想考我浮点误差还是整数特性"——这题显然考的是浮点误差。