QT4 學習筆記:QT4提供的數學函數

QT的一些範例中有出現 qmax, qmin 等 math函式的身影,但我在官方文件中卻找不到與 math函式相關的說明,所以我就把函式的source裡面提供的方法整理條列,並且看看還有哪些 math相關的函式可用。在 qglobal.h 裡,可以找到幾種 math函式,條列於下,但一般常用的 math如:qfloor(無條件捨去)、qceil(無條件進位)、qsin,qcos,qtan(三角函數) 等等等...則是都沒有看到。

  • qAbs ( const &value )
    說明:返回絕對值
    範例:
    int absoluteValue;
     int myValue = -4;
     absoluteValue = qAbs(myValue); 
     // absoluteValue == 4
  • qBound ( const &min, const &value, const &max )
    說明:返回極限不超過 min , max 的值, 等同於 qMax(min, qMin(value, max))
    範例:
    int myValue = 10;
     int minValue = 2;
     int maxValue = 6;
    
     int boundedValue = qBound(minValue, myValue, maxValue);
     // boundedValue == 6

  • qMax ( const &value1, const &value2 )
    說明:返回最大值
    範例:
    int myValue = 6;
     int yourValue = 4;
    
     int maxValue = qMax(myValue, yourValue);
     // maxValue == 6
  • qMin ( const & value1, const &value2 )
    說明:返回最小值
    範例:
    int myValue = 6;
     int yourValue = 4;
    
     int minValue = qMin(myValue, yourValue);
     // minValue == 4
  • int qRound ( qreal value )
    說明:返回四捨五入的整數
    範例:
    qreal valueA = 2.3;
     qreal valueB = 2.7;
    
     int roundedValueA = qRound(valueA); 
     // roundedValueB = 2
     int roundedValueB = qRound(valueB); 
     // roundedValueB = 3
    
  • qint64 qRound64 ( qreal value )
    說明:返最接近的64位元整數
    範例:
    qreal valueA = 42949672960.3;
     qreal valueB = 42949672960.7;
    
     int roundedValueA = qRound(valueA); 
     // roundedValueA = 42949672960
     int roundedValueB = qRound(valueB); 
     // roundedValueB = 42949672961
    
  • int qrand ()
    說明:thread-safe版本的標準C++亂數函式,返回 0 到 RAND_MAX之間的數字序列之下一個整數,使用qsrand(uint seed) 重新給定種子
    範例:
    qreal valueA = qrand() % 100; // 41
     qreal valueB = qrand() % 10; // 7
     qreal valueC = qrand() % 2; // 0
     qsrand(0xffffffff);
     valueA = qrand() % 100; // 35
     valueB = qrand() % 10; // 9
     valueC = qrand() % 2; // 0
     qsrand(0xffffff);
     valueA = qrand() % 100; // 35
     valueB = qrand() % 10; // 3
     valueC = qrand() % 2; // 0
    
  • bool qFuzzyCompare ( double p1, double p2 ) [靜態方法]
    說明:比較兩個長浮點數的大小,如果兩者相同返回true,反之為否,同樣為thread-safe。另外也提供float版本的方法: bool qFuzzyCompare ( float p1, float p2 ) [static]
    範例:
    qreal valueA = 42949672960.3;
     qreal valueB = 42949672960.7;
    
     bool equal = qFuzzyCompare(valueFA,valueFB); 
     // equal = false
    

3 意見

  1. {id: "Ticore"}; //

    08/11/21 下午7:13

    基本常用的 math 方法
    在 C++ StdLib 內就可以找到了
    好像沒有必要特別去用 qt 的~
    http://www.cplusplus.com/reference/

    不過 C++ Reference 文件實在有點混亂
    找了幾個網站,每個網站的版本都略有差異
    沒有找到一個是最完整的 ><

  2. mediakid

    08/11/22 上午11:11

    因為對c++不熟,又看到有qmin這些東西,想說要是有內建夠用的東西就太好了,看來qt內建的是很不夠用的,還是要透過c++的lib,感謝 Ticore大的分享和指教~

    關於是否要使用qt僅有的math方法,我在source裡的說明一直看到一個關鍵字 "thread-safe",好像qt的書上有說到 QList這個container是thread-safe的,所以不知道這會不會是qt特別提供這幾個math方法的原因。

  3. mediakid

    08/11/23 上午1:38

    在QT的書上看到一小段話,「如果你已經非常熟析STL容器並且在目標平台上STL是可用的,就沒有必要再使用Qt容器了。有關STL類和函數的更多信息,對初學者來講,SGI的STL網站 http://www.sgi.com/tech/stl/ 是一個好地方。」

    一句話打到了我的兩個"甜蜜點",一個是我想應該就像Ticore大說的,對於math方法應該就是會了STL就不需要用Qt內建的math方法了,另一個是書本上也推薦了SGI的STL,給Ticore大參考看看~