C++标准模板(STL)- 类型支持 (数值极限,is_exact,has_infinity,has_quiet_NaN)

news2024/11/27 1:45:38

数值极限

定义于头文件 <limits>

template< class T > class numeric_limits;

numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits<int>::max() )。
 

鉴别准确表示的类型

std::numeric_limits<T>::is_exact

static const bool is_exact;

(C++11 前)

static constexpr bool is_exact;

(C++11 起)

 std::numeric_limits<T>::is_exact 的值对所有使用准确表示的算术类型 T 为 true 。

标准特化

Tstd::numeric_limits<T>::is_exact 的值
/* non-specialized */false
booltrue
chartrue
signed chartrue
unsigned chartrue
wchar_ttrue
char8_ttrue
char16_ttrue
char32_ttrue
shorttrue
unsigned shorttrue
inttrue
unsigned inttrue
longtrue
unsigned longtrue
long longtrue
unsigned long longtrue
floatfalse
doublefalse
long doublefalse

注意

尽管对于所有 std::numeric_limits<T>::is_exact==true 的基础类型 T 都是整数类型,库可以定义非整数的准确类型,例如表示分数的有理数算术类型。

调用示例

#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized   = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_exact         = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::is_exact:                 "
              << std::numeric_limits<bool>::is_exact << std::endl;
    std::cout << "std::numeric_limits<char>::is_exact:                 "
              << std::numeric_limits<char>::is_exact << std::endl;
    std::cout << "std::numeric_limits<signed char>::is_exact:          "
              << std::numeric_limits<signed char>::is_exact << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::is_exact:        "
              << std::numeric_limits<unsigned char>::is_exact << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::is_exact:              "
              << std::numeric_limits<wchar_t>::is_exact << std::endl;
    std::cout << "std::numeric_limits<char16_t>::is_exact:             "
              << std::numeric_limits<char16_t>::is_exact << std::endl;
    std::cout << "std::numeric_limits<char32_t>::is_exact:             "
              << std::numeric_limits<char32_t>::is_exact << std::endl;
    std::cout << "std::numeric_limits<short>::is_exact:                "
              << std::numeric_limits<short>::is_exact << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::is_exact:       "
              << std::numeric_limits<unsigned short>::is_exact << std::endl;
    std::cout << "std::numeric_limits<int>::is_exact:                  "
              << std::numeric_limits<int>::is_exact << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::is_exact:         "
              << std::numeric_limits<unsigned int>::is_exact << std::endl;
    std::cout << "std::numeric_limits<long>::is_exact:                 "
              << std::numeric_limits<long>::is_exact << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::is_exact:        "
              << std::numeric_limits<unsigned long>::is_exact << std::endl;
    std::cout << "std::numeric_limits<long long>::is_exact:            "
              << std::numeric_limits<long long>::is_exact << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::is_exact:   "
              << std::numeric_limits<unsigned long long>::is_exact << std::endl;
    std::cout << "std::numeric_limits<float>::is_exact:                "
              << std::numeric_limits<float>::is_exact << std::endl;
    std::cout << "std::numeric_limits<double>::is_exact:               "
              << std::numeric_limits<double>::is_exact << std::endl;
    std::cout << "std::numeric_limits<long double>::is_exact:          "
              << std::numeric_limits<long double>::is_exact << std::endl;
    std::cout << "std::numeric_limits<std::string>::is_exact:          "
              << std::numeric_limits<std::string>::is_exact << std::endl;
    std::cout << "std::numeric_limits<SName>::is_exact:                "
              << std::numeric_limits<SName>::is_exact << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::is_exact:            "
              << std::numeric_limits<SPartSpec>::is_exact << std::endl;
    return 0;
}

输出

鉴别能表示特殊值“正无穷大”的浮点类型

std::numeric_limits<T>::has_infinity

static const bool has_infinity;

(C++11 前)

static constexpr bool has_infinity;

(C++11 起)

 std::numeric_limits<T>::has_infinity 的值对所有能够表示正无穷大为独立特殊值的类型 T 为 true 。此常量对所有浮点类型有意义,且保证若 std::numeric_limits<T>::is_iec559 == true 则为 true 。

标准特化

Tstd::numeric_limits<T>::has_infinity 的值
/* non-specialized */false
boolfalse
charfalse
signed charfalse
unsigned charfalse
wchar_tfalse
char8_tfalse
char16_tfalse
char32_tfalse
shortfalse
unsigned shortfalse
intfalse
unsigned intfalse
longfalse
unsigned longfalse
long longfalse
unsigned long longfalse
float通常为 true
double通常为 true
long double通常为 true

调用示例 

#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized   = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_exact         = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_infinity     = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::has_infinity:                 "
              << std::numeric_limits<bool>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<char>::has_infinity:                 "
              << std::numeric_limits<char>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<signed char>::has_infinity:          "
              << std::numeric_limits<signed char>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::has_infinity:        "
              << std::numeric_limits<unsigned char>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::has_infinity:              "
              << std::numeric_limits<wchar_t>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<char16_t>::has_infinity:             "
              << std::numeric_limits<char16_t>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<char32_t>::has_infinity:             "
              << std::numeric_limits<char32_t>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<short>::has_infinity:                "
              << std::numeric_limits<short>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::has_infinity:       "
              << std::numeric_limits<unsigned short>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<int>::has_infinity:                  "
              << std::numeric_limits<int>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::has_infinity:         "
              << std::numeric_limits<unsigned int>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<long>::has_infinity:                 "
              << std::numeric_limits<long>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::has_infinity:        "
              << std::numeric_limits<unsigned long>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<long long>::has_infinity:            "
              << std::numeric_limits<long long>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::has_infinity:   "
              << std::numeric_limits<unsigned long long>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<float>::has_infinity:                "
              << std::numeric_limits<float>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<double>::has_infinity:               "
              << std::numeric_limits<double>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<long double>::has_infinity:          "
              << std::numeric_limits<long double>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<std::string>::has_infinity:          "
              << std::numeric_limits<std::string>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<SName>::has_infinity:                "
              << std::numeric_limits<SName>::has_infinity << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::has_infinity:            "
              << std::numeric_limits<SPartSpec>::has_infinity << std::endl;
    return 0;
}

输出

鉴别能表示特殊值“安静的非数”( NaN )的浮点类型

std::numeric_limits<T>::has_quiet_NaN

static const bool has_quiet_NaN;

static constexpr bool has_quiet_NaN;

 std::numeric_limits<T>::has_quiet_NaN 的值对所有能够表示特殊值“安静的非数”的类型 T 为 true 。此常量对所有浮点类型有意义,并保证若 std::numeric_limits<T>::is_iec559 == true 则为 true 。

标准特化

Tstd::numeric_limits<T>::has_quiet_NaN 的值
/* non-specialized */false
boolfalse
charfalse
signed charfalse
unsigned charfalse
wchar_tfalse
char8_tfalse
char16_tfalse
char32_tfalse
shortfalse
unsigned shortfalse
intfalse
unsigned intfalse
longfalse
unsigned longfalse
long longfalse
unsigned long longfalse
float通常为 true
double通常为 true
long double通常为 true

调用示例

#include <iostream>
#include <string>
#include <limits>

struct SName
{
};

//偏特化
struct SPartSpec
{
};

namespace std
{
template<>
struct numeric_limits<SPartSpec>
{
    static _GLIBCXX_USE_CONSTEXPR bool is_specialized   = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_signed        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_integer       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_exact         = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_infinity     = true;
    static _GLIBCXX_USE_CONSTEXPR bool has_quiet_NaN    = true;
};
}

int main()
{
    std::cout << std::boolalpha;
    std::cout << "std::numeric_limits<bool>::has_quiet_NaN:                 "
              << std::numeric_limits<bool>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<char>::has_quiet_NaN:                 "
              << std::numeric_limits<char>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<signed char>::has_quiet_NaN:          "
              << std::numeric_limits<signed char>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<unsigned char>::has_quiet_NaN:        "
              << std::numeric_limits<unsigned char>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<wchar_t>::has_quiet_NaN:              "
              << std::numeric_limits<wchar_t>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<char16_t>::has_quiet_NaN:             "
              << std::numeric_limits<char16_t>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<char32_t>::has_quiet_NaN:             "
              << std::numeric_limits<char32_t>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<short>::has_quiet_NaN:                "
              << std::numeric_limits<short>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<unsigned short>::has_quiet_NaN:       "
              << std::numeric_limits<unsigned short>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<int>::has_quiet_NaN:                  "
              << std::numeric_limits<int>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<unsigned int>::has_quiet_NaN:         "
              << std::numeric_limits<unsigned int>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<long>::has_quiet_NaN:                 "
              << std::numeric_limits<long>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<unsigned long>::has_quiet_NaN:        "
              << std::numeric_limits<unsigned long>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<long long>::has_quiet_NaN:            "
              << std::numeric_limits<long long>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<unsigned long long>::has_quiet_NaN:   "
              << std::numeric_limits<unsigned long long>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<float>::has_quiet_NaN:                "
              << std::numeric_limits<float>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<double>::has_quiet_NaN:               "
              << std::numeric_limits<double>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<long double>::has_quiet_NaN:          "
              << std::numeric_limits<long double>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<std::string>::has_quiet_NaN:          "
              << std::numeric_limits<std::string>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<SName>::has_quiet_NaN:                "
              << std::numeric_limits<SName>::has_quiet_NaN << std::endl;
    std::cout << "std::numeric_limits<SPartSpec>::has_quiet_NaN:            "
              << std::numeric_limits<SPartSpec>::has_quiet_NaN << std::endl;
    return 0;
}

 输出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1075534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在Kubernetes中实现gRPC流量负载均衡

在尝试将gRPC服务部署到Kubernetes集群中时&#xff0c;一些用户&#xff08;包括我&#xff09;面临的挑战之一是实现适当的负载均衡。在深入了解如何平衡gRPC的方式之前&#xff0c;我们首先需要回答一个问题&#xff0c;即为什么需要平衡流量&#xff0c;如果Kubernetes已经…

【技能树笔记】网络篇——练习题解析(五)

目录 前言 一、应用层的作用 1.1 应用层的作用 二、HTTP协议 2.1 HTTP协议 三、FTP协议 3.1 FTP协议 四、DNS协议 4.1 DNS协议 五、DHCP协议 5.1 DHCP协议 六、邮件协议 6.1 电子邮件协议 总结 前言 本篇文章给出了CSDN网络技能树中的部分练习题解析&#xff0c…

检验检疫系统(LIS)源码:C# + MVC + SQLserver + Redis

LIS系统源码技术特点&#xff1a;采用.Net Core新的技术框架、DEV报表、前端js封装、分布式文件存储、分布式缓存等&#xff0c;支持LIS独立部署&#xff0c;Docker部署等多种方式。 技术架构&#xff1a;ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C…

每日一题——数据分析题

2023年上海市高等学校信息技术水平考试模拟题&#xff1a;数据分析题 读取csv文件这里可以使用pd.read_csv() import pandas as pd# 读取CSV文件 fileroad r素材\city_GDP.csv data pd.read_csv(fileroad, encodinggbk)# 输入地区城市名 city input("请输入城市&#…

SpringBoot之实现Web消息实时消息推送

文章目录 1 实时消息推送1.1 消息推送1.2 准备sql1.3 短轮询1.4 长轮询1.4.1 简介1.4.2 代码示例 1.5 iframe流1.6 SSE1.6.1 简介1.6.2 与 WebSocket 区别1.6.3 代码示例 1.7 MQTT1.7.1 简介1.7.2 为什么要用 MQTT协议 1.8 WebSocket 1 实时消息推送 1.1 消息推送 推送的场景…

[NCTF2019]SQLi regexp 盲注

/robots.txt 访问一下 $black_list "/limit|by|substr|mid|,|admin|benchmark|like|or|char|union|substring|select|greatest|%00|\|| |in|<|>|-|\.|\(\)|#|and|if|database|users|where|table|concat|insert|join|having|sleep/i";If $_POST[passwd] admi…

Vue的MVVM模型

MVVM模型代表三个东西&#xff1a; 1. M : 模型&#xff08;model&#xff09; --> data中的数据 2. V : 视图&#xff08;view) --> 模版代码 3. VM : 视图模型&#xff08;viewmodel&#xff09; --> Vue实例 我们用代码来展示上图中的关系&#xff1a; 也就…

激光除草距离我们实际的农业生活还有多远,结合近期所见所感基于yolov8开发构建田间作物杂草检测识别系统

最近的中秋、国庆双节相信很多朋友都会回家和家人团聚&#xff0c;我也一样&#xff0c;我的家乡是比较小众偏远的乡村&#xff0c;童年给我的最大的记忆就是干不完的农活&#xff0c;而这农活中很大一部分就是蹲在田间地头去人力拔草、撒肥料等&#xff0c;人力终究是很慢效率…

【Linux】 vi / vim 使用

天天用vim 或者vi 。看着大佬用的很6 。我们却用的很少。今天咱们一起系统学习一下。 vi / vim 发展史 vi 是一款由加州大学伯克利分校&#xff0c;Bill Joy研究开发的文本编辑器。 vim Vim是一个类似于Vi的高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多…

京东商品链接获取京东商品详情数据接口(用 Python 实现京东商品信息抓取)

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取京东网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;京东网站…

iTunes是什么意思?iTunes详细使用教程来了!

很多使用苹果设备的小伙伴听说过iTunes&#xff0c;但却很少接触这个软件。就像小编一样&#xff0c;一开始感觉自己根本用不上iTunes。但是当了解到iTunes的知识与使用技巧后&#xff0c;小编才意识到它有多好用。那么&#xff0c;itunes是什么意思&#xff1f;iTunes到底有什…

python爬虫:多线程收集/验证IP从而搭建有效IP代理池

目录 一、前言 二、IP池的实现 1. 收集代理IP 2. 验证代理IP可用性 3. 搭建IP代理池 三、多线程实现 四、代理IP的使用 五、总结 一、前言 在网络爬虫中&#xff0c;IP代理池的作用非常重要。网络爬虫需要大量的IP地址来发送请求&#xff0c;同时为了降低被封禁的风险…

四、WebGPU Storage Buffers 存储缓冲区

四、WebGPU Storage Buffers 存储缓冲区 存储缓冲区 storage buffers 在许多方面 uniform buffers 缓冲区相似。如果我们所做的只是在JavaScript中将UNIFORM改为STORAGE&#xff0c;WGSL 中的 var 改为 var<storage,read>&#xff0c;上一节的示例代码同样可以运行并达到…

React +ts + babel+webpack

babel babel/preset-typescript 专门处理ts "babel/cli": "^7.17.6", "babel/core": "^7.17.8", "babel/preset-env": "^7.16.11", "babel/preset-react": "^7.16.7", "babel/preset…

vue3学习(二)--- ref和reactive

文章目录 ref1.1 ref将基础类型和对象类型数据转为响应式1.2 ref()获取id元素1.3 isRef reactive1.1 reactive()将引用类型数据转为响应式数据&#xff0c;基本类型无效1.2 ref和reactive的联系 toRef 和 toRefs1.1 如果原始对象是非响应式的就不会更新视图 数据是会变的 ref …

Redis高可用技术 二:主从复制、哨兵、Cluster集群

文章目录 1. 主从复制1.1 简介1.2 主从复制的作用1.3 主从复制的特性1.4 主从复制的工作原理1.4.1 全量复制1.4.2 增量复制 1.5 Redis主从同步策略 2. 搭建Redis主从复制2.1 前置准备2.2 配置master节点2.3 配置slave1-2节点2.4 主从复制结果验证 3. 哨兵模式3.1 简介3.2 哨兵的…

若依微服务部署,裸服务部署、docker部署、k8s部署

目录 前言windows 部署若依-微服务版本浏览器验证docker部署若依-微服务版本浏览器验证k8s部署若依-微服务版本浏览器验证总结 前言 环境&#xff1a;centos7、Win10 若依是一个合适新手部署练习的开源的微服务项目&#xff0c;本篇讲解Windows部署若依微服务、docker部署若依…

【鼠标右键菜单添加用VSCode打开文件或文件夹】

鼠标右键菜单添加用VSCode打开文件或文件夹 演示效果如下&#xff1a; 右击文件 或右击文件夹 或在文件夹内空白处右击 方法一&#xff1a;重装软件 重装软件&#xff0c;安装时勾选如图所示方框&#xff08;如果登录的有账号保存有配置信息可以选择重装软件&#xff0c…

YOLOv7暴力涨点:Gold-YOLO,遥遥领先,超越所有YOLO | 华为诺亚NeurIPS23

💡💡💡本文独家改进:提出了全新的信息聚集-分发(Gather-and-Distribute Mechanism)GD机制,Gold-YOLO,替换yolov7 head部分 实现暴力涨点 Gold-YOLO | 亲测在多个数据集能够实现大幅涨点,适用各个场景的涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnim…

49位主播带货破亿,单品直播销量100万+,9月的黑马都是谁?

9月&#xff0c;抖音电商开始为下半年重要的营销节点做出筹备&#xff0c;不仅发起抖音中秋好礼季&#xff0c;还抢先发布双11品牌玩法攻略&#xff0c;活跃平台的消费氛围。 那么&#xff0c;9月有哪些主播表现突出&#xff0c;哪些商品在畅销&#xff0c;哪些达人的粉丝数飙升…