std::numeric_limits的一个使用注意事项
作者:朱金灿
来源:http://blog.csdn.net/clever101
在C/C++11中,std::numeric_limits为模板类,在库编译平台提供基础算术类型的极值等属性信息,取代传统C语言所采用的预处理常数(具体参考:C++常用数值类型的值范围的宏定义)。其中使用例子如下:
#include <limits>
#include <iostream>/* reference: http://www.cplusplus.com/reference/limits/numeric_limits/ https://msdn.microsoft.com/en-us/library/c707ct0t.aspx
*/
int test_numeric_limits_1()
{ std::cout << std::boolalpha; std::cout << "Minimum value for int: " << std::numeric_limits<int>::min() << std::endl; std::cout << "Maximum value for int: " << std::numeric_limits<int>::max() << std::endl; std::cout << "int is signed: " << std::numeric_limits<int>::is_signed << std::endl; std::cout << "Non-sign bits in int: " << std::numeric_limits<int>::digits << std::endl; std::cout << "int has infinity: " << std::numeric_limits<int>::has_infinity << std::endl; std::cout << "Minimum value for float: " << std::numeric_limits<float>::min() << std::endl; // min returns the smallest positive value the type can encode, not the lowest std::cout << "Lowest value for float: " << std::numeric_limits<float>::lowest() << std::endl; // the lowest value std::cout << "Maximum value for float: " << std::numeric_limits<float>::max() << std::endl; std::cout << "float is signed: " << std::numeric_limits<float>::is_signed << std::endl; std::cout << "Non-sign bits in float: " << std::numeric_limits<float>::digits << std::endl; std::cout << "float has infinity: " << std::numeric_limits<float>::has_infinity << std::endl; std::cout << "Minimum value for unsigned short: " << std::numeric_limits<unsigned short>::min() << std::endl; std::cout << "Maximum value for unsigned short: " << std::numeric_limits<unsigned short>::max() << std::endl; std::cout << "is_specialized(float): " << std::numeric_limits<float>::is_specialized << std::endl; std::cout << "is_integer(float): " << std::numeric_limits<float>::is_integer << std::endl; std::cout << "is_exact(float): " << std::numeric_limits<float>::is_exact << std::endl; std::cout << "is_bounded(float): " << std::numeric_limits<float>::is_bounded << std::endl; std::cout << "is_modulo(float): " << std::numeric_limits<float>::is_modulo << std::endl; std::cout << "is_iec559(float): " << std::numeric_limits<float>::is_iec559 << std::endl; std::cout << "digits10(float): " << std::numeric_limits<float>::digits10 << std::endl; std::cout << "radix(float): " << std::numeric_limits<float>::radix << std::endl; std::cout << "min_exponent(float): " << std::numeric_limits<float>::min_exponent << std::endl; std::cout << "max_exponent(float): " << std::numeric_limits<float>::max_exponent << std::endl; std::cout << "min_exponent10(float): " << std::numeric_limits<float>::min_exponent10 << std::endl; std::cout << "max_exponent10(float): " << std::numeric_limits<float>::max_exponent10 << std::endl; std::cout << "epsilon(float): " << std::numeric_limits<float>::epsilon() << std::endl; std::cout << "round_style(float): " << std::numeric_limits<float>::round_style << std::endl; std::cout << "The smallest nonzero denormalized value for float: " << std::numeric_limits<float>::denorm_min()<< std::endl; std::cout << "The difference between 1 and the smallest value greater than 1 for float: " << std::numeric_limits<float>::epsilon()<< std::endl; std::cout << "Whether float objects allow denormalized values: " << std::numeric_limits<float>::has_denorm << std::endl; std::cout << "Whether float objects can detect denormalized loss: " << std::numeric_limits<float>::has_denorm_loss << std::endl; std::cout << "Whether float objects have quiet_NaN: " << std::numeric_limits<float>::has_quiet_NaN << std::endl; std::cout << "Whether float objects have a signaling_NaN: " << std::numeric_limits<float>::has_signaling_NaN << std::endl; std::cout << "The base for type float is: " << std::numeric_limits<float>::radix << std::endl; std::cout << "The maximum rounding error for type float is: " << std::numeric_limits<float>::round_error() << std::endl; std::cout << "The rounding style for a double type is: " << std::numeric_limits<double>::round_style << std::endl; std::cout << "The signaling NaN for type float is: " << std::numeric_limits<float>::signaling_NaN() << std::endl; std::cout << "Whether float types can detect tinyness before rounding: " << std::numeric_limits<float>::tinyness_before << std::endl; std::cout << "Whether float types have implemented trapping: " << std::numeric_limits<float>::traps << std::endl; return 0;
}
但是在使用std::numeric_limits时经常会出现一个编译错误:
1>main.cpp(473):error C2059: 语法错误:“::”
1> main.cpp(474): warning C4003: “min”宏的实参不足。
网上查了一下资料,了解了这个错误的原因:windows.h中定义了min宏,<limits >中也有这个定义,两者冲突了。windows.h中Microsoft定义了min/max两个宏,< limits >中定义的min/max两个宏虽然在自己的命名空间中,可还是被“污染”了。因此要避免冲突,就得先屏蔽windows.h中定义的min宏,具体做法是在所有包含头文件前面(注意是所有)增加下面的预处理语句:
#ifndef NOMINMAX #define NOMINMAX
#endif
参考文献:
1. C++/C++11中std::numeric_limits的使用
2. opencv编程解决warning C4003: “max”宏的实参不足
std::numeric_limits的一个使用注意事项相关推荐
- std::uniform_real_distribution的一个bug引发的服务器崩溃
文章目录 前言 崩溃问题 std::uniform_real_distribution<> 的bug bug 重现方法 总结 前言 近日发生一次线上游戏服务器宕机问题,通过日志和core文 ...
- boost::multiprecision模块将 std::numeric_limits 用作 multiprecision.qbk 上的多精度文档片段的示例
boost::multiprecision模块将 std::numeric_limits 用作 multiprecision.qbk 上的多精度文档片段的示例 实现功能 C++实现代码 实现功能 bo ...
- C++ std::numeric_limits
一 简介 头文件<limits> template <class T> numeric_limits; Provides information about the prope ...
- C++/C++11中std::numeric_limits的使用
在C/C++11中,std::numeric_limits为模板类,在库编译平台提供基础算术类型的极值等属性信息,取代传统C语言,所采用的预处理常数.比较常用的使用是对于给定的基础类型用来判断在当前系 ...
- std::set作为一个有序集合
摘要:std::set作为标准库的一个关联容器,实现内部元素进行了排序,使用这特性可以对一组元素进行插入排序.std::set最初的设计是完成数学中"集合"的概念,它提供的接口也是 ...
- 从零开始写一个Android待办事项ToDoListApp
概述 初衷 作为一个程序员,每天要处理的事项越来越多,有时一件事情花费了太多的时间而忽略了还有其他事情等着处理.开始是借助Microsoft ToDo 来记录下待办事项,时不时的去看一下,勾选掉已经完 ...
- oracle定时任务会漂移,定时任务与手动执行脚本时的一个重要注意事项
今天在linux环境下做了一个定时任务,用java程序到oracle中查询数据, 手动执行脚本没有问题,但是定时任务执行时却一直报错: - java.sql.SQLException: ORA-006 ...
- [c++]std::vector erase 檫除注意事项
std::vector<int> deletes; //从后向前删除for(int i = 0;i<res.size();i++) //遍历所有目标{if((res[i].x + r ...
- 阿里OCR接入一个小注意事项
前面的平台注册 服务开通直接略过,直接讲要注意的两个点 1: 引入这个ocr_ui模块,他里面有这几个架构,你对应的的主工程也要做这几个架构的适配.不然有些手机会报错 2:获取token方式 通过ht ...
- max std value 宏_【转载】:【C++跨平台系列】解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题...
多年以前,Microsoft 幹了一件比 #define N 3 還要蠢的蠢事,那就是在 放入了 min/max 這兩個宏命令(macros). #define max(a,b) ...
最新文章
- 国内maven库镜像(阿里云)
- (互联网)Yahoo邮箱的改版
- 使用create-react-app遇到问题解决方案汇总
- Flume实操(二)【实时读取本地文件到HDFS案例】
- c语言打印数组元素_C程序打印元素差为0或1的子集数
- 一个通用的makefile写法,自动推导文件的依赖关系
- Volley网络请求框架简析——Android网络请求框架(三)
- 杭电1466计算直线的交点数
- 基础总结篇之八:创建及调用自己的ContentProvider
- linux未找到make命令,linux中无make命令的问题(make: *** 没有指明目标并且找不到 makefile及make命令安装方法)...
- Flask 蓝图(Blueprint)
- 计算机全息图的制作与在线,基于Matlab的计算全息图的制作与数字再现的研究精选.doc...
- windows10如何注销
- uview ui与element ui的区别和用法
- VBA增加sheet,重名时自动命名
- 20、Theos越狱调试Wallet
- 计算机学识水平自我评价,计算机毕业自我鉴定范文
- PyMC3 概率编程入门
- 22.扩展.等保测评相关实务
- eclipse中注释快捷键