numeric_limits 悠悠 2022-06-16 05:43 162阅读 0赞 出处:http://blog.163.com/wujiaxing009@126/blog/static/7198839920124135147911/ 初学C++的时候,对这个模板很陌生,不知道它到底是做什么用的,今天拿起《C++标准程序库》,出现了它的讨论,所以决定好好研究一番。 1. numeric\_limits是什么? (A)《C++标准程序库》: **\[cpp\]** [view plain][] [cop][view plain] 1. 一般来说,数值型别的极值是一个与平台相关的特性。C++标准程序库通过**template** numeric\_limits提供这些极值,取代传统C语言,所采用的预处理常数。新的极值概念有两个优点,第一是提供更好的型别安全性,第二是程序员可借此写出一些**template**以核定这些极值。 (B)MSDN **\[cpp\]** [view plain][] [copy][view plain] 1. The **template** **class** describes arithmetic properties of built-in numerical types. 2. 3. The header defines **explicit** specializations **for** the types **wchar\_t**, **bool**, **char**, **signed** **char**, unsigned **char**, **short**, unsigned **short**, **int**, unsigned **int**, **long**, unsigned **long**, **float**, **double**, 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\_t**, **bool**, **char**, **signed** **char**, unsigned **char**, **short**, unsigned **short**, **int**, unsigned **int**, **long**, unsigned **long**, **float**, **double**, and **long** **double**这些类型提供了特化。对于这些类型来说,is\_specialized为**true**,并且所有的相关的成员(成员变量或成员函数)是有意义的。这个模板也提供其他的特化。大部分的成员函数可以用**float**型别来描述或测试。 14. 15. 对于一个任意的特化,相关的成员是没有意义的。一个没有意义的对象一般用0(或者**false**)来表示,一个没有意义的成员函数会返回0. (C)我的理解 **\[cpp\]** [view plain][] [copy][view plain] 1. 说白了,它是一个模板类,它主要是把C++当中的一些内建型别进行了封装,比如说numeric\_limits<**int**>是一个特化后的类,从这个类的成员变量与成员函数中,我们可以了解到**int**的很多特性:可以表示的最大值,最小值,是否是精确的,是否是有符号等等。如果用其他任意(非内建类型)来特化这个模板类,比如string,string怎么可能有最大值?我们从MSDN上可以了解到,这对string,成员变量与成员函数是没有意义的,要么返回0要么为**false**。 2. 小例展示numeric\_limits的基本用法: **\[cpp\]** [view plain][] [copy][view plain] 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. \} 我机器上的运行结果: **\[c-sharp\]** [view plain][] [copy][view plain] 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型别可以表示的最小的正值, 而不是最小的float数。 从这个例子中,我们差不多了解到numeric\_limits的基本用法。 3. 基本成员函数 我以float类型来展示: **\[c-sharp\]** [view plain][] [copy][view plain] 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][view plain] 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. 请按任意键继续. . . [view plain]: http://blog.csdn.net/netrookie/article/details/5530578#
还没有评论,来说两句吧...