2011-05-28 63 views
8

我有一個模板函數對浮點參數進行操作。該函數是模板化的,以便調用者可以使用float,double或任何其他浮點數據類型。模板代碼中的浮點常量

在我的代碼中的一個點上,我將一個值與零(或任何其他浮點常量)進行比較。我應該使用0.0還是0.0f進行比較?

template<T> void f(T a){ 
    // should I use 0.0 or 0.0f in the following line? 
    if(a == 0.0){ 
    } 
} 

儘管目前這沒有造成任何問題,但我想知道通常的做法。

回答

13

我建議

if (a == T(0)) ... 
+0

+1。最好。明確。 – Nawaz 2011-05-28 14:46:05

+0

是的!多數民衆贊成什麼Std用於這樣事情,也是。 – towi 2011-05-28 14:50:47

+0

+1爲解決方案本身,但我希望答案有其他人的解釋! – 2011-05-28 14:57:35

7

我會建議簡單0。根據數字類型的升級規則,0將升級爲浮點操作數a的類型。促進常量是編譯時的轉換,它不會放慢你的程序。


在另一方面,使用0.0將迫使其他操作的運行時間轉換翻一番,這可能是一個非的問題,因爲操作數是在FPU寄存器最有可能通過反正。 0.0f不會導致浮點操作數的轉換,但是如果模板曾經用於整數類型,則可以將運行時轉換爲float

+0

謝謝。其他常數值呢? – 2011-05-28 14:49:32

+0

@Agnel:非整數常量值?那麼不要使用浮點相等性測試。 – 2011-05-28 14:52:11

+0

你說得對。我會用一個epsilon。但即使如此,問題仍然存在:我是使用浮點型還是雙字型? – 2011-05-28 14:54:18

1

你不應該平等的浮點數用一個簡單的

if (value == 0.0) // or 0.0f, doesn't matter 

比較,因爲大部分的時間也不會產生您所期望的結果。你應該檢查是否value足夠接近你期望的數字。那就是:

if (abs(value - 0.0) < epsilon) 

其中epsilon對於您的應用程序域來說足夠小。