-1

问题非常简单:考虑两个浮点数,它们可能按位不相等,但在所有可能的意义上差异都相对较小。我们还假设他们的楼层之间的差异小于一些相对较小的 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. 标准对此有何评论?

UPD 我用描述替换了不正确的示例。(感谢@MarcGlisse 和
@KevinBallard 指出错误。)

UPD 2 这是很好地涵盖了这个问题的主题:Floor() and ceil() Representable result of floor() and ceil()

4

2 回答 2

2

fabs(floor(a) - floor(b)) < 0.0001仅当floor(a) == floor(b),只要您处于双精度可以准确表示的整数范围内:在 std::floor 之后转换为 int 是否保证正确的结果?

于 2013-02-13T21:09:22.710 回答
0

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

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

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

于 2014-06-21T12:23:04.063 回答