問題很簡單:考慮兩個浮點數可能不是按位相等,但差異在所有可能的意義上都相對較小。我們還假設他們的樓層之間的差異小於一些相對較小的ε(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