C++ limits头文件的用法(numeric_limits)

初学C++的时候对这个模板很陌生不知道它到底是做什么用的今天拿起《C++标准程序库》出现了它的讨论所以决定好好研究一番。

1. numeric_limits是什么?

A)《C++标准程序库》

[cpp] view plaincop

  1. 一般来说数值型别的极值是一个与平台相关的特性。C++标准程序库通过template numeric_limits提供这些极值取代传统C语言所采用的预处理常数。新的极值概念有两个优点第一是提供更好的型别安全性第二是程序员可借此写出一些template以核定这些极值。

(B)MSDN

[cpp] view plaincopy

  1. The template class describes arithmetic properties of built-in numerical types.
  2. 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.
  3. 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).
  4. 上面的意思是说
  5. 这个模板类描述了内建类型的数值属性。
  6. 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型别来描述或测试。
  7. 对于一个任意的特化相关的成员是没有意义的。一个没有意义的对象一般用0(或者false)来表示一个没有意义的成员函数会返回0.

(C)我的理解

[cpp] view plaincopy

  1. 说白了它是一个模板类它主要是把C++当中的一些内建型别进行了封装比如说numeric_limits<int>是一个特化后的类从这个类的成员变量与成员函数中我们可以了解到int的很多特性可以表示的最大值最小值是否是精确的是否是有符号等等。如果用其他任意(非内建类型)来特化这个模板类比如string,string怎么可能有最大值?我们从MSDN上可以了解到这对string成员变量与成员函数是没有意义的要么返回0要么为false。

2. 小例展示numeric_limits的基本用法

[cpp] view plaincopy

  1. #include <limits>
  2. #include <iostream>
  3. using namespace std;
  4. int main() {
  5. cout << boolalpha;
  6. cout << "max(short): " << numeric_limits<short>::max() << endl;
  7. cout << "min(short): " << numeric_limits<short>::min() << endl;
  8. cout << "max(int): " << numeric_limits<int>::max() << endl;
  9. cout << "min(int): " << numeric_limits<int>::min() << endl;
  10. cout << "max(long): " << numeric_limits<long>::max() << endl;
  11. cout << "min(long): " << numeric_limits<long>::min() << endl;
  12. cout << endl;
  13. cout << "max(float): " << numeric_limits<float>::max() << endl;
  14. cout << "min(float): " << numeric_limits<float>::min() << endl;
  15. cout << "max(double): " << numeric_limits<double>::max() << endl;
  16. cout << "min(double): " << numeric_limits<double>::min() << endl;
  17. cout << "max(long double): " << numeric_limits<long double>::max() << endl;
  18. cout << "min(long double): " << numeric_limits<long double>::min() << endl;
  19. cout << endl;
  20. cout << "is_signed(char): "
  21. << numeric_limits<char>::is_signed << endl;
  22. cout << "is_specialized(string): "
  23. << numeric_limits<string>::is_specialized << endl;
  24. }

我机器上的运行结果

[c-sharp] view plaincopy

  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. max(float): 3.40282e+038
  8. min(float): 1.17549e-038
  9. max(double): 1.79769e+308
  10. min(double): 2.22507e-308
  11. max(long double): 1.79769e+308
  12. min(long double): 2.22507e-308
  13. is_signed(char): true
  14. is_specialized(string): false
  15. 请按任意键继续. . .

关于为什么float的最小值竟然是正的?我也存在疑问从结果中我们看出min返回的是float型别可以表示的最小的正值

而不是最小的float数。

从这个例子中我们差不多了解到numeric_limits的基本用法。

3. 基本成员函数

我以float类型来展示

[c-sharp] view plaincopy

  1. #include <limits>
  2. #include <iostream>
  3. using namespace std;
  4. int main() {
  5. cout << boolalpha;
  6. // 可以表示的最大值
  7. cout << "max(float): " << numeric_limits<float>::max() << endl;
  8. // 可以表示的大于0的最小值其他类型的实现或与此不同
  9. cout << "min(float): " << numeric_limits<float>::min() << endl;
  10. // 标准库是否为其实现了特化
  11. cout << "is_specialized(float): " << numeric_limits<float>::is_specialized << endl;
  12. // 是否是有符号的即可以表示正负值
  13. cout << "is_signed(float): " << numeric_limits<float>::is_signed << endl;
  14. // 不否是整形的
  15. cout << "is_integer(float): " << numeric_limits<float>::is_integer << endl;
  16. // 是否是精确表示的
  17. cout << "is_exact(float): " << numeric_limits<float>::is_exact << endl;
  18. // 是否存在大小界限
  19. cout << "is_bounded(float): " << numeric_limits<float>::is_bounded << endl;
  20. // 两个比较大的数相加而不会溢出生成一个较小的值
  21. cout << "is_modulo(float): " << numeric_limits<float>::is_modulo << endl;
  22. // 是否符合某某标准
  23. cout << "is_iec559(float): " << numeric_limits<float>::is_iec559 << endl;
  24. // 不加+-号可以表示的位数
  25. cout << "digits(float): " << numeric_limits<float>::digits << endl;
  26. // 十进制数的个数
  27. cout << "digits10(float): " << numeric_limits<float>::digits10 << endl;
  28. // 一般基数为2
  29. cout << "radix(float): " << numeric_limits<float>::radix << endl;
  30. // 以2为基数的最小指数
  31. cout << "min_exponent(float): " << numeric_limits<float>::min_exponent << endl;
  32. // 以2为基数的最大指数
  33. cout << "max_exponent(float): " << numeric_limits<float>::max_exponent << endl;
  34. // 以10为基数的最小指数
  35. cout << "min_exponent10(float): " << numeric_limits<float>::min_exponent10 << endl;
  36. // 以10为基数的最大指数
  37. cout << "max_exponent10(float): " << numeric_limits<float>::max_exponent10 << endl;
  38. // 1值和最接近1值的差距
  39. cout << "epsilon(float): " << numeric_limits<float>::epsilon() << endl;
  40. // 舍入方式
  41. cout << "round_style(float): " << numeric_limits<float>::round_style << endl;
  42. }

运行结果

[cpp] view plaincopy

  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. 请按任意键继续. . .

C++ limits头文件的用法(numeric_limits)

时间: 2024-11-05 14:44:08

C++ limits头文件的用法(numeric_limits)的相关文章

limits头文件,类型的固定常量方便使用

要判断某种特定类型可以容纳的最大值或最小值,一种简便的方法是使用ANSI标准头文件limits.h中的预定义值.该文件包含一些很有用的常量,它们定义了各种类型所能容纳的值,下表列出了这些常量:----------------------------------------------------------------常 量 描 述----------------------------------------------------------------CHAR_BIT char的位数(bi

c++符号常量:limits头文件

CHAR_BIT char的位数 CHAR_MAX char的最大值 CHAR_MIN char的最小值 SCHAR_MAX signed char的最大值 SCHR_MIN signedchar的最小值 UCHAR_MAX unsigned char的最大值 SHRT_MAX short的最大值 SHRT_MIN short的最小值 USHRT_MAX unsigned short的最大值 INT_MAX int的最大值 INT_MIN int的最小值 UNIT_MAX unsigned in

leetCode(55):Minimum Window Substring(limits.h头文件)

Given a string S and a string T, find the minimum window in S which will contain all the characters in T in complexity O(n). For example, S = "ADOBECODEBANC" T = "ABC" Minimum window is "BANC". Note: If there is no such windo

浅谈c/c++头文件中#ifndef/#define/#endif的用法

想必很多人都看过“头文件中用到的 #ifndef/#define/#endif 来防止该头文件被重复引用”.但是是否能理解“被重复引用”是什么意思?头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码? 1. 其实“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的.如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include &q

头文件&lt;limits.h&gt;

头文件<limits.h>用来检测整型数据类型的表达式范围. Linux version 2.6.32-573.el6.x86_64中<limits.h>源码: /* Copyright (C) 1991, 1992, 1996, 1997, 1998, 1999, 2000, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free s

一个小程序猿思考之路-头文件中#ifndef/#define/#endif作用和用法

编写自定义头文件时,原来就是随意的编写一些内容,但是很少去想过头文件的格式: 突然一天,发现自己的头文件里有这么几个小东西 : #ifndef DAO_H#define DAO_H ... #endif 上面这个有什么详细的意义? 恍惚的记着是为了避免头文件多次调用,造成多次编译,引起重定义的错误:

extern 用法,全局变量与头文件(重复定义)

http://www.cnblogs.com/chengmin/archive/2011/09/26/2192008.html 用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字,如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢??这个问题一直也是似是而非的困扰着我许多年了,今天上网狠狠查了一下总算小有所获了: 头文件 首先说下头文件,其实头文件对计算

头文件 INTRINS.H 的用法

KEIL中头文件INTRINS.H的作用 在C51单片机编程中,头文件INTRINS.H的函数使用起来,就会让你像在用汇编时一样简便. 内部函数 描述 crol_ 字符循环左移_cror_ 字符循环右移_irol_ 整数循环左移_iror_ 整数循环右移_lrol_ 长整数循环左移_lror_ 长整数循环右移_nop_ 空操作8051 NOP 指令_testbit_ 测试并清零位8051 JBC 指令 函数名: _crol_,_irol_,_lrol_原 型: unsigned char _cr

C预编译, 预处理, C/C++头文件, 编译控制,

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数. (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输