簡體   English   中英

STL,BOOST中的浮點比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM