2013-02-13 106 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。