问题很简单:考虑两个浮点数可能不是按位相等,但差异在所有可能的意义上都相对较小。我们还假设他们的楼层之间的差异小于一些相对较小的ε(0.01应该是绝对足够的)。他们的楼层是否按位相等(即运算符==相等)?比较楼层/小区后的浮点数/双精度比较
例如,下面的返回true
代码的所有时间:
bool areRoundedFloatsEqual(float lhs, float rhs) {
if (lhs > 0 && rhs > 0 && fabs(lhs - rhs) < 0.01) {
lhs = std::floor(lhs);
rhs = std::floor(rhs);
if (fabs(lhs - rhs) < 0.5)
return lhs == rhs;
}
return true;
}
其实我感兴趣的两个问题:
- 将在现实生活中发生什么事?
- 标准对此有何评论?
UPD 有不正确的示例我描述替代。 (感谢@MarcGlisse和
@KevinBallard在错误指向)
UPD 2 这里是涵盖这个问题相当不错的话题:Representable result of floor() and ceil()
两个版本都可以返回false。 – 2013-02-13 20:27:23
@MarcGlisse为什么首先可以返回false(如果我们假设浮动到int转换成功)? – anxieux 2013-02-13 20:29:57
@anxieux:如果'lhs'是'9.999'而'rhs'是'10.001',它将超过条件,但最终比较'9 == 10'。 – 2013-02-13 20:30:58