2013-02-13 214 views
-1

问题很简单:考虑两个浮点数可能不是按位相等,但差异在所有可能的意义上都相对较小。我们还假设他们的楼层之间的差异小于一些相对较小的ε(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; 
} 

其实我感兴趣的两个问题:

  1. 将在现实生活中发生什么事?
  2. 标准对此有何评论?

UPD 有不正确的示例我描述替代。 (感谢@MarcGlisse和
@KevinBallard在错误指向)

UPD 2 这里是涵盖这个问题相当不错的话题:Representable result of floor() and ceil()

+0

两个版本都可以返回false。 – 2013-02-13 20:27:23

+0

@MarcGlisse为什么首先可以返回false(如果我们假设浮动到int转换成功)? – anxieux 2013-02-13 20:29:57

+0

@anxieux:如果'lhs'是'9.999'而'rhs'是'10.001',它将超过条件,但最终比较'9 == 10'。 – 2013-02-13 20:30:58

回答

0

floor(x)和ceil(x)始终为整数值。

两个数字floor或ceil(x)和floor或ceil(y)之间的任何差异是两个整数值之间的差值,因此是整数。

当且仅当两个值相同时,此差值的绝对值小于1。