在地板/天花板之后逐位比较浮动/双打

时间:2013-02-13 20:23:12

标签: c++ floating-point rounding

问题非常简单:考虑两个浮点数可能不是按位相等,但差异在所有可能的意义上都相对较小。我们还假设他们的楼层之间的差异小于一些相对较小的epsilon(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. 标准说什么?
  3. UPD 有一个不正确的例子我用描述替换。 (谢谢@MarcGlisse和
    @KevinBallard指出错误。)

    UPD 2 以下是涵盖此问题的主题:Representable result of floor() and ceil()

2 个答案:

答案 0 :(得分:2)

fabs(floor(a) - floor(b)) < 0.0001仅在floor(a) == floor(b)时,只要您在双精度范围内可以准确表示:Does casting to an int after std::floor guarantee the right result?

答案 1 :(得分:0)

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

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

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