[英]Floating point comparison in 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 );
}
編輯:我將運算符更改為相等。 (見下面的評論)
我不知道有沒有這樣做的圖書館,也許是因為它像一個班輪一樣簡單,或者也許是因為它被遺忘了......
一般情況下,您確定要在整個應用程序中為給定值的某個給定類型設置epsilon嗎? 我個人想根據我正在進行的操作來定制它(即使默認值很好)。
至於您的操作員,為什么不自己設計呢?
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;
}
不平等和大於方法可以簡單地從中得出。
附加參數意味着您可能希望為給定的一組計算指定另一個值...應用程序范圍的設置太嚴格。
你可以找到“復雜”的比較-邏輯的一些原因在這里 ,升壓測試庫的文檔。
來自Marcelo Cantos的評論:
...然后你還需要一個返回false的<test,即使第一個數字比第二個數字略小。
我想會實現的是:
return !roughly_equal(a, b) && a < b;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.