2014-03-03 66 views
2

我有下面的代碼段(隨意改變浮體與雙):關於比較的整數和浮點值/雙重在C/C++

class A 
{ 
    public: 
     void setValueFloat(float v) { 
       m_floatValue = v/3.6; // m/s <-> km/h conversion 
     } 
     void setValueInt(int v1, int v2) { 
       m_intValue1 = v1; m_intValue2 = v2; 
     } 

     bool conditionIsOk() 
     { 
      if(m_intValue1 > m_intValue2) 
      { 
        if(m_intValue1 - m_intValue2 > m_floatValue) 
        { 
         return true; 
        } 
      } 
      return false; 
     } 

    private: 
     int m_intValue1, m_intValue2; 
     float m_floatValue; 

}; 

和別處:

A a; 
int something = 5; // Intentionally int 
int somethingElse = 6; //these are just some numbers, not production data!!! 
int moreStuff = 7; 

a.setValueFloat(something); 
a.setValueInt(somethingElse, moreStuff); 
if(a.conditionIsOk()) 
{ 
    // Yippee! 
} 

而且問題:

  1. 如何安全是它的算術運算的結果比較上int小號根據上述情況給float

  2. 這種情況是否需要(float)m_intValue1 - (float)m_intValue2 > m_floatValue

  3. 在C/C++標準中,我可以找到關於這種情況的一行嗎?

  4. 對於簡單情況,默認情況下會完成哪些類型轉換m_intValue1 - m_intValue2 > m_floatValue? (我怎樣才能讓這的方式,他也看到它(視覺)別人「只是認爲它的工作原理」是不夠的:))

+1

這是最決然不會C. – ciphermagi

+2

@ciphermagi只是刪除了'class'執行,然後它會。我對背後的理論更感興趣。 – fritzone

+0

忽略類和布爾運算符,可以像上面那樣設置類似於C的東西,然而你基本上是問如果(2> 2.5)' – ciphermagi

回答

5
  1. 這取決於實際的實現(即使用哪個編譯器和哪個體系結構)。在典型的32位位系統和IEEE754二進制位系統上,整數可以精確地表示爲+ -2^24作爲浮點數,所以不適用於所有可能的值。所以不,一般來說並不安全,但是如果你的整數的使用範圍(或者在這種情況下,而不是這個差別!)和浮點數是有限的。

  2. 不!實際上,m_intValue1 - m_intValue2 > m_floatValue更好,因爲在計算差異後發生浮動轉換(請參閱關於上述差異的注意事項)。你可以明確寫出static_cast<float>(m_intValue1 - m_intValue2) > m_floatValue,但這不是必需的。

  3. 轉換包含在C++標準的第4章中(請參閱draft N3242)。特別是4.9浮點 - 整數轉換,還要注意5§10「通常的算術轉換」,這也適用於比較。由於問題也用C標記,在C標準中(見darft N1570),相應的部分是6.3.1,特別是6.3.1.4和6.3.1.8。

  4. 見回答2和3

3

的類型提升的一般規則在二進制運算應用。引用該期望的算術或枚舉類型原因的轉換操作數的標準(第5章表達式)

9.Many二元運算符,並以類似的方式得到 結果類型。目的是產生一個共同的類型,這也是結果的類型。

這種模式被稱爲通常的算術轉換,其被定義如下:

如果一個操作數的範圍的枚舉類型(7。2),不執行轉換;

如果另一個操作數不具有相同類型,則表達式格式不正確。

如果任一操作數的類型爲long double,則另一個操作數應轉換爲long double。

否則,如果其中一個操作數爲雙倍,另一個應轉換爲雙倍。

否則,如果任一操作數是浮點數,則另一個操作數應轉換爲浮點數。

否則,積分促銷活動(4.5),應在兩個操作數