2010-05-14 51 views
9

在STL或Boost中是否有一組通用的簡單比較函數?在STL中的浮點比較,BOOST

我發現的那個總是需要模板參數,和/或實例化一個 結構模板。

我正在尋找的東西與語法,如:

if (is_equal(x,y)) 
{ 
    ... 
} 

這可能是實現爲:

template <typename T> 
bool is_equal(const T& x, const T& y) 
{ 
    return (fabs(x - y) < Precision<T>::eps); 
} 

編輯:我改變了運營商平等。 (見下面的評論)

+1

爲什麼你會使用epsilon比較大或小? – AshleysBrain 2010-05-14 09:47:56

+3

對於浮點型或雙精度型需要比較的唯一時間是等於'=='的比較。對於epsilon,或多或少都沒有任何意義,因爲當他們相等時,你希望得到的答案是什麼?如果更大或更小都是以您提及的方式定義的,那麼在相同的情況下,您將得到一個 b = true和a == b = true,這是不正確的。正確的行爲是,如果a == b,則a> b = false,並且a Akanksh 2010-05-14 09:55:01

+5

@Akanksh,上面的實現可能並不正確,但基於epsilon的不平等對於您突出顯示的場景來說是有意義且重要的。如果兩個數字根據基於epsilon的「==」測試相等,那麼即使第一個數字比第二個數字稍小,也需要一個返回false的<<測試。 – 2010-05-14 10:00:52

回答

9

我不知道,再這樣庫的,也許是因爲它是作爲一個班輪或也許是因爲它被遺忘了一樣簡單......

作爲一般性推移,雖然,你確定你」 d想要在給定的價值下爲給定類型設置一個ε...在整個應用程序中?就我個人而言,我想根據我所做的操作對其進行定製(即使默認設置會很好)。

至於你的運營商,爲什麼不自己設計呢?

template <class T> 
bool rough_eq(T lhs, T rhs, T epsilon = Precision<T>::epsilon) // operator== 
{ 
    return fabs(lhs - rhs) < epsilon; 
} 

template <class T> 
bool rough_lt(T lhs, T rhs, T epsilon = Precision<T>::epsilon) // operator< 
{ 
    return rhs - lhs >= epsilon; 
     // tricky >= because if the difference is equal to epsilon 
     // then they are not equal per the rough_eq method 
} 

template <class T> 
bool rough_lte(T lhs, T rhs, T epsilon = Precision<T>::epsilon) // operator<= 
{ 
    return rhs - lhs > -epsilon; 
} 

不平等和大於方法可以從這個平凡的派生。

附加參數意味着您可能希望爲給定的一組計算指定另一個值......應用程序範圍的設置太嚴格。

+0

粗略也可以通過導出 a <=b <=>!(a> b)<=>!(b fulmicoton 2010-05-14 12:47:59

+0

是的,我只是想顯示與epsilon :) – 2010-05-14 12:49:57

0

從馬塞洛詩章的評論:

...那麼你還需要一個<測試 返回false,即使第一 數量是不斷所謂稍小比第二個還要多 。

我想象的實現將是:

return !roughly_equal(a, b) && a < b; 
+0

這不能回答我的問題。 無論如何,爲什麼反對定義更大,然後定義更少和平等的通過實現更大和更小的平等? x y ! ((y> x)或(x> y)) 是否有一些性能問題? – fulmicoton 2010-05-14 11:42:53

+0

不是。一般情況下,你可以單獨定義'<'和'==',即使'=='由於性能而可能(從理論上)從(<)推導出來。重要的是要保持邏輯關係,雖然... – 2010-05-14 12:22:13

1

你可以找到「複雜」的比較 - 邏輯的一些原因,升壓測試庫的文檔。