c++ limits頭文件的用法

初學C++的時候,對這個模板很陌生,不知道它究竟是作什麼用的,今天拿起《C++標準程序庫》,出現了它的討論,因此決定好好研究一番。 ios

1. numeric_limits是什麼? git

(A)《C++標準程序庫》: 程序員

[cpp]  view plain cop
  1. 通常來講,數值型別的極值是一個與平臺相關的特性。C++標準程序庫經過template numeric_limits提供這些極值,取代傳統C語言,所採用的預處理常數。新的極值概念有兩個優勢,第一是提供更好的型別安全性,第二是程序員可藉此寫出一些template以覈定這些極值。  

(B)MSDN 安全

[cpp]  view plain copy
  1. The template class describes arithmetic properties of built-in numerical types.  
  2.   
  3. The header defines explicit specializations for the types wchar_tboolcharsigned char, unsigned charshort, unsigned shortint, unsigned intlong, unsigned longfloatdouble, and long double. For these explicit specializations, the member numeric_limits::is_specialized is true, and all relevant members have meaningful values. The program can supply additional explicit specializations. Most member functions of the class describe or test possible implementations of float.  
  4.   
  5. For an arbitrary specialization, no members have meaningful values. A member object that does not have a meaningful value stores zero (or false) and a member function that does not return a meaningful value returns Type(0).  
  6.   
  7.   
  8.   
  9. 上面的意思是說:  
  10.   
  11. 這個模板類描述了內建類型的數值屬性。  
  12.   
  13. C++標準庫顯式地爲wchar_tboolcharsigned char, unsigned charshort, unsigned shortint, unsigned intlong, unsigned longfloatdouble, and long double這些類型提供了特化。對於這些類型來講,is_specialized爲true,而且全部的相關的成員(成員變量或成員函數)是有意義的。這個模板也提供其餘的特化。大部分的成員函數能夠用float型別來描述或測試。  
  14.   
  15. 對於一個任意的特化,相關的成員是沒有意義的。一個沒有意義的對象通常用0(或者false)來表示,一個沒有意義的成員函數會返回0.  

 

(C)個人理解 函數

[cpp]  view plain copy
  1. 說白了,它是一個模板類,它主要是把C++當中的一些內建型別進行了封裝,好比說numeric_limits<int>是一個特化後的類,從這個類的成員變量與成員函數中,咱們能夠了解到int的不少特性:能夠表示的最大值,最小值,是不是精確的,是不是有符號等等。若是用其餘任意(非內建類型)來特化這個模板類,好比string,string怎麼可能有最大值?咱們從MSDN上能夠了解到,這對string,成員變量與成員函數是沒有意義的,要麼返回0要麼爲false。  

2. 小例展現numeric_limits的基本用法: 測試

[cpp]  view plain copy
  1. #include <limits>  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. int main() {  
  6.     cout << boolalpha;  
  7.   
  8.     cout << "max(short): " << numeric_limits<short>::max() << endl;  
  9.     cout << "min(short): " << numeric_limits<short>::min() << endl;  
  10.   
  11.     cout << "max(int): " << numeric_limits<int>::max() << endl;  
  12.     cout << "min(int): " << numeric_limits<int>::min() << endl;  
  13.   
  14.     cout << "max(long): " << numeric_limits<long>::max() << endl;  
  15.     cout << "min(long): " << numeric_limits<long>::min() << endl;  
  16.   
  17.     cout << endl;  
  18.   
  19.     cout << "max(float): " << numeric_limits<float>::max() << endl;  
  20.     cout << "min(float): " << numeric_limits<float>::min() << endl;  
  21.   
  22.     cout << "max(double): " << numeric_limits<double>::max() << endl;  
  23.     cout << "min(double): " << numeric_limits<double>::min() << endl;  
  24.   
  25.     cout << "max(long double): " << numeric_limits<long double>::max() << endl;  
  26.     cout << "min(long double): " << numeric_limits<long double>::min() << endl;  
  27.   
  28.     cout << endl;  
  29.   
  30.     cout << "is_signed(char): "  
  31.         << numeric_limits<char>::is_signed << endl;  
  32.     cout << "is_specialized(string): "   
  33.         << numeric_limits<string>::is_specialized << endl;  
  34. }  

我機器上的運行結果: ui

[c-sharp]  view plain copy
  1. max(short): 32767  
  2. min(short): -32768  
  3. max(int): 2147483647  
  4. min(int): -2147483648  
  5. max(long): 2147483647  
  6. min(long): -2147483648  
  7.   
  8. max(float): 3.40282e+038  
  9. min(float): 1.17549e-038  
  10. max(double): 1.79769e+308  
  11. min(double): 2.22507e-308  
  12. max(long double): 1.79769e+308  
  13. min(long double): 2.22507e-308  
  14.   
  15. is_signed(char): true  
  16. is_specialized(string): false  
  17. 請按任意鍵繼續. . .  

關於爲何float的最小值居然是正的?我也存在疑問,從結果中,咱們看出,min返回的是float型別能夠表示的最小的正值, spa

而不是最小的float數。 .net

從這個例子中,咱們差很少了解到numeric_limits的基本用法。 對象

 

3. 基本成員函數

我以float類型來展現:

[c-sharp]  view plain copy
  1. #include <limits>  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. int main() {  
  6.     cout << boolalpha;  
  7.     // 能夠表示的最大值  
  8.     cout << "max(float): " << numeric_limits<float>::max() << endl;  
  9.     // 能夠表示的大於0的最小值,其餘類型的實現或與此不一樣  
  10.     cout << "min(float): " << numeric_limits<float>::min() << endl;  
  11.     // 標準庫是否爲其實現了特化  
  12.     cout << "is_specialized(float): " << numeric_limits<float>::is_specialized << endl;  
  13.     // 是不是有符號的,便可以表示正負值  
  14.     cout << "is_signed(float): " << numeric_limits<float>::is_signed << endl;  
  15.     // 不否是整形的  
  16.     cout << "is_integer(float): " << numeric_limits<float>::is_integer << endl;  
  17.     // 是不是精確表示的  
  18.     cout << "is_exact(float): " << numeric_limits<float>::is_exact << endl;  
  19.     // 是否存在大小界限  
  20.     cout << "is_bounded(float): " << numeric_limits<float>::is_bounded << endl;  
  21.     // 兩個比較大的數相加而不會溢出,生成一個較小的值  
  22.     cout << "is_modulo(float): " << numeric_limits<float>::is_modulo << endl;  
  23.     // 是否符合某某標準  
  24.     cout << "is_iec559(float): " << numeric_limits<float>::is_iec559 << endl;  
  25.     // 不加+-號能夠表示的位數  
  26.     cout << "digits(float): " << numeric_limits<float>::digits << endl;  
  27.     // 十進制數的個數  
  28.     cout << "digits10(float): " << numeric_limits<float>::digits10 << endl;  
  29.     // 通常基數爲2  
  30.     cout << "radix(float): " << numeric_limits<float>::radix << endl;  
  31.     // 以2爲基數的最小指數  
  32.     cout << "min_exponent(float): " << numeric_limits<float>::min_exponent << endl;  
  33.     // 以2爲基數的最大指數  
  34.     cout << "max_exponent(float): " << numeric_limits<float>::max_exponent << endl;  
  35.     // 以10爲基數的最小指數  
  36.     cout << "min_exponent10(float): " << numeric_limits<float>::min_exponent10 << endl;  
  37.     // 以10爲基數的最大指數  
  38.     cout << "max_exponent10(float): " << numeric_limits<float>::max_exponent10 << endl;  
  39.     // 1值和最接近1值的差距  
  40.     cout << "epsilon(float): " << numeric_limits<float>::epsilon() << endl;  
  41.     // 舍入方式  
  42.     cout << "round_style(float): " << numeric_limits<float>::round_style << endl;  
  43. }  

運行結果:

[cpp]  view plain copy
  1. max(float): 3.40282e+038  
  2. min(float): 1.17549e-038  
  3. is_specialized(float): true  
  4. is_signed(float): true  
  5. is_integer(float): false  
  6. is_exact(float): false  
  7. is_bounded(float): true  
  8. is_modulo(float): false  
  9. is_iec559(float): true  
  10. digits(float): 24  
  11. digits10(float): 6  
  12. radix(float): 2  
  13. min_exponent(float): -125  
  14. max_exponent(float): 128  
  15. min_exponent10(float): -37  
  16. max_exponent10(float): 38  
  17. epsilon(float): 1.19209e-007  
  18. round_style(float): 1  
  19. 請按任意鍵繼續. . .  
相關文章
相關標籤/搜索