对一个四舍五入的数字求取与四舍五入后的数字不同的答案吗?
有时查看角落案例可以揭示反例。
void rtest(double x) {
double y1 = floor(round(x));
double y2 = round(x);
printf("%d %- 14e %- 14e %- 14e\n", y1 != y2, x, y1, y2);
}
int main(void) {
double x[] = { 0.0, DBL_TRUE_MIN, DBL_MIN, 1.0, 3.14, 3.99, DBL_MAX, 1.0/0.0, 0.0/0.0};
for (unsigned i=0; i< sizeof x/sizeof x[0]; i++) {
rtest(x[i]);
rtest(-x[i]);
}
}
输出
0 0.000000e+00 0.000000e+00 0.000000e+00
0 -0.000000e+00 -0.000000e+00 -0.000000e+00
0 4.940656e-324 0.000000e+00 0.000000e+00
0 -4.940656e-324 -0.000000e+00 -0.000000e+00
0 2.225074e-308 0.000000e+00 0.000000e+00
0 -2.225074e-308 -0.000000e+00 -0.000000e+00
0 1.000000e+00 1.000000e+00 1.000000e+00
0 -1.000000e+00 -1.000000e+00 -1.000000e+00
0 3.140000e+00 3.000000e+00 3.000000e+00
0 -3.140000e+00 -3.000000e+00 -3.000000e+00
0 3.990000e+00 4.000000e+00 4.000000e+00
0 -3.990000e+00 -4.000000e+00 -4.000000e+00
0 1.797693e+308 1.797693e+308 1.797693e+308
0 -1.797693e+308 -1.797693e+308 -1.797693e+308
0 inf inf inf
0 -inf -inf -inf
1 -nan -nan -nan
1 nan nan nan
在处理 ieee-754 数字时,floor(round(x)) != round(x) 为真或(根据 OP 的问题“不一定相等”)当 x 不是非数字时。
否则round() 的结果始终是整数值或无穷大,并且`floor-ing 不会改变值。
我检查了各种舍入模式,结果都一样。