问题非常简单:考虑两个浮点数可能不是按位相等,但差异在所有可能的意义上都相对较小。我们还假设他们的楼层之间的差异小于一些相对较小的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;
}
事实上,我对两个问题感兴趣:
UPD
有一个不正确的例子我用描述替换。 (谢谢@MarcGlisse和
@KevinBallard指出错误。)
UPD 2 以下是涵盖此问题的主题:Representable result of floor() and ceil()
答案 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。