C++标准模板(STL)- 类型支持 (数值极限,traps,tinyness_before)

news2024/11/27 20:31:45

数值极限

std::numeric_limits

定义于头文件 <limits>

定义于头文件 <limits>

template< class T > class numeric_limits;

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

鉴别可能导致算术运算出现陷阱的类型

std::numeric_limits<T>::traps

static const bool traps;

(C++11 前)

static constexpr bool traps;

(C++11 起)

 std::numeric_limits<T>::traps 的值,对所有至少有一个若用作算术运算参数则会生成陷阱的值的算术类型 T 为 true 。

标准特化

Tstd::numeric_limits<T>::traps 的值
/* non-specialized */false
boolfalse
char通常为 true
signed char通常为 true
unsigned char通常为 true
wchar_t通常为 true
char8_t通常为 true
char16_t通常为 true
char32_t通常为 true
short通常为 true
unsigned short通常为 true
int通常为 true
unsigned int通常为 true
long通常为 true
unsigned long通常为 true
long long通常为 true
unsigned long long通常为 true
float通常为 false
double通常为 false
long double通常为 false

注意

大多数平台上,除以零始终会产生陷阱,而对所有支持值 0 的整数类型, std::numeric_limits<T>::traps 为 true 。例外是类型 bool :即使除以 false 因为从 bool 整数提升到 int 而产生陷阱,这也是零值的 int 所产生的陷阱。零不是 bool 的值。

大多数平台上,浮点异常可以在运行时开关(例如 Linux 上的 feenableexcept() 或 Windows 上的 _controlfp ),该情况下 std::numeric_limits<T>::traps 对浮点类型的值反映程序启动时的浮点陷阱设施,它在大多数现代系统上为 false 。 DEC Alpha 程序可以是例外,若不以 -ieee 编译程序,则为 true 。

调用示例

#include <iostream>
#include <string>
#include <limits>
#include <cstdint>
#include <cfloat>

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;
    static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm     = denorm_present;
    static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss  = true;
    static _GLIBCXX_USE_CONSTEXPR float_round_style round_style     = round_toward_neg_infinity;
    static _GLIBCXX_USE_CONSTEXPR bool is_iec559        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_bounded       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_modulo        = true;
    static _GLIBCXX_USE_CONSTEXPR int  digits           = CHAR_BIT;
    static _GLIBCXX_USE_CONSTEXPR int  digits10         = CHAR_BIT;
    static _GLIBCXX_USE_CONSTEXPR int  max_digits10     = DECIMAL_DIG;
    static _GLIBCXX_USE_CONSTEXPR int  radix            = FLT_RADIX;
    static _GLIBCXX_USE_CONSTEXPR int  min_exponent     = FLT_MIN_EXP;
    static _GLIBCXX_USE_CONSTEXPR int  min_exponent10   = FLT_MIN_10_EXP;
    static _GLIBCXX_USE_CONSTEXPR int  max_exponent     = FLT_MAX_EXP;
    static _GLIBCXX_USE_CONSTEXPR int  max_exponent10   = FLT_MAX_EXP;
    static _GLIBCXX_USE_CONSTEXPR bool traps            = true;
};
}

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

输出

鉴别检测舍入前是否非正规的浮点类型

std::numeric_limits<T>::tinyness_before

static const bool tinyness_before;

(C++11 前)

static constexpr bool tinyness_before;

(C++11 起)

 std::numeric_limits<T>::tinyness_before 的值对所有测试浮点表达式在舍入前下溢的浮点类型 T 为 true 。

标准特化

Tstd::numeric_limits<T>::tinyness_before 的值
/* 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实现定义
double实现定义
long double实现定义

注意

符合标准的 IEEE 754 浮点实现要求检测浮点下溢,并在执行处有二种可选的情形

1) 若假如以指数范围和精度均为无界的计算,产生绝对值小于 std::numeric_limits<T>::min() 的结果,则发生下溢(并且可能引发 FE_UNDERFLOW )。这种实现在舍入前检测是否较小(如 UltraSparc 、 POWER )。

2) 若舍入到目标浮点类型(即舍入到 std::numeric_limits<T>::digits 位)后,结果的绝对值小于 std::numeric_limits<T>::min() ,则发生下溢(并且可能引发 FE_UNDERFLOW )。正式地说,假如以指数范围和精度均为无界的计算,非零结果的绝对值小于 std::numeric_limits<T>::min() 。这种实现在舍入后检测是否较小(如 SuperSparc )

调用示例

#include <iostream>
#include <string>
#include <limits>
#include <cstdint>
#include <cfloat>

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;
    static _GLIBCXX_USE_CONSTEXPR bool has_signaling_NaN = true;
    static _GLIBCXX_USE_CONSTEXPR float_denorm_style has_denorm     = denorm_present;
    static _GLIBCXX_USE_CONSTEXPR bool has_denorm_loss  = true;
    static _GLIBCXX_USE_CONSTEXPR float_round_style round_style     = round_toward_neg_infinity;
    static _GLIBCXX_USE_CONSTEXPR bool is_iec559        = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_bounded       = true;
    static _GLIBCXX_USE_CONSTEXPR bool is_modulo        = true;
    static _GLIBCXX_USE_CONSTEXPR int  digits           = CHAR_BIT;
    static _GLIBCXX_USE_CONSTEXPR int  digits10         = CHAR_BIT;
    static _GLIBCXX_USE_CONSTEXPR int  max_digits10     = DECIMAL_DIG;
    static _GLIBCXX_USE_CONSTEXPR int  radix            = FLT_RADIX;
    static _GLIBCXX_USE_CONSTEXPR int  min_exponent     = FLT_MIN_EXP;
    static _GLIBCXX_USE_CONSTEXPR int  min_exponent10   = FLT_MIN_10_EXP;
    static _GLIBCXX_USE_CONSTEXPR int  max_exponent     = FLT_MAX_EXP;
    static _GLIBCXX_USE_CONSTEXPR int  max_exponent10   = FLT_MAX_EXP;
    static _GLIBCXX_USE_CONSTEXPR bool traps            = true;
    static _GLIBCXX_USE_CONSTEXPR bool tinyness_before  = true;
};
}

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

输出

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

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

相关文章

ESD静电电压监控系统的作用是什么

ESD静电电压监控系统的作用是实时监测生产环境中的静电电压&#xff0c;及时检测和预防ESD静电电压过高的情况&#xff0c;保护设备和产品的质量&#xff0c;确保生产过程的安全和稳定。 具体来说&#xff0c;ESD静电电压监控系统可以实现以下功能&#xff1a; 实时监测静电电压…

华为云应用中间件DCS系列—Redis实现(社交APP)实时评论

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;应用中间件系列之Redis实现&#xff08;社交APP&#xff09;实时评论 1 什么是DEVKIT 华为云开发者插件&#xff08;Huawei Cloud Toolkit&#xff09;&#xff0…

[科研琐事] 安装服务器的二三事

1. 机柜参数 宽度&#xff1a;一般机器都是符合的&#xff1b; 深度&#xff1a;对应服务器最长的那个边&#xff1b; 厚度&#xff08;高度&#xff09;&#xff1a;1/2/3/4U&#xff0c;就是机柜上写的刻度数字&#xff0c;1U1.75英寸。 1U4.45cm 2U4.45cm * 2 3U4.45cm * …

揭秘OLED透明拼接屏的参数规格:分辨率、亮度与透明度全解析

作为一种新型的显示技术&#xff0c;OLED透明拼接屏在市场中正在迅速崭露头角&#xff0c;有很多知名品牌厂家能设计、开发、生产高品质的显示产品。 如尼伽、起鸿、康视界、LG、YCTIMES、腾裕等&#xff0c;这些品牌在显示技术领域拥有丰富的经验和声誉&#xff0c;以其卓越的…

聚观早报 | 特斯拉发布赛博啤酒套装;小米汽车售价曝光

【聚观365】10月16日消息 特斯拉发布赛博啤酒套装 小米汽车售价曝光 新款Model Y 国内已开启交付 苹果将推出新款 iPad mini / Air 保时捷销量中国区大跌 特斯拉发布赛博啤酒套装 特斯拉在美国市场推出CyberBeerCyberStein限量套装&#xff0c;售价150美元&#xff08;约…

USB PD3.1

目前我们大多数Type-C接口仍然采用的是PD3.0快充协议&#xff0c;按当前用户的使用场景来看功率也完全够用&#xff0c;那么PD3.1快充协议是什么&#xff1f;USB PD3.1到底有没有必要&#xff1f; 不妨我们先了解一下PD3.1: 5月25日&#xff0c;USB-IF协会推出了USB Type-C线…

CSS Display(显示) 与 Visibility(可见性)

display属性设置一个元素应如何显示&#xff0c;visibility属性指定一个元素应可见还是隐藏。 隐藏元素 - display:none或visibility:hidden 隐藏一个元素可以通过把display属性设置为"none"&#xff0c;或把visibility属性设置为"hidden"。但是请注意&a…

Linux下内存检测利器Valgrind之Memcheck工具详解

目录 1、Valgrind简介 1.1、Memcheck工具 1.2、Callgrind工具 1.3、Cachegrind工具 1.4、Helgrind工具 1.5、Massif工具 2、如何使用Memcheck 2.1、启动Memcheck 2.2、输出消息解释 3、使用Memcheck检测内存问题实例 4、Valgrind和Memcheck其他命令选项 5、最后 VC…

如何处理前端错误和异常?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.6 定时器事件

本章要实现的整体效果如下&#xff1a; QT 中使用定时器&#xff0c;有两种方式&#xff1a; 定时器类&#xff1a;QTimer定时器事件&#xff1a;QEvent::Timer&#xff0c;对应的子类是 QTimerEvent 本节通过一个案例&#xff0c;同时讲解这两种方式 案例&#xff1a;当点击…

微信怎么加好友?竟然有5种方法!

微信是我们日常生活中不可缺少的通信工具。在我们的工作或者学习中&#xff0c;我们可能需要主动添加他人的微信来建立联系&#xff0c;以便日后进行更好地沟通。那微信怎么加好友呢&#xff1f;小编给大家总结了5种添加微信好友的方法&#xff01;没想到吧&#xff0c;居然有这…

低温下安装振弦采集仪注意事项

低温下安装振弦采集仪注意事项 振弦采集仪是一种用于测量和监测结构物振动状态的设备&#xff0c;通常用于桥梁、大型建筑物、风力发电机、船舰等设施的监测和评估。在一些寒冷地区&#xff0c;设施的使用环境会面临低温的挑战&#xff0c;因此在安装振弦采集仪时需要注意以下…

解决window电脑使用IKE VPN登录时显示上下文已过期,不能再用了的方法。

当电脑登录VPN时出现上下文已过期&#xff0c;不能再用了时解决办法。 1、使用 winR 的按键打打开运行&#xff1b; 2、输入 services.msc 在服务的列表中找到 IKE and AuthIP IPsec Keying Modules 这个服务&#xff0c;可以看到该服务为禁用状态下。 3、双击该服务&#xf…

论文复现:Active Learning by Learning

这篇文章说实在的&#xff0c;写的差强人意。 实质性内容是两个现有方法的拼凑&#xff01; 讲的模模糊糊&#xff01;对于复现代码不太友好&#xff01; 撸一点&#xff0c;通读一遍 &#xff0c;再撸一点&#xff0c;通读一遍~~~ """ 注意&#xff1a;使用…

Flutter 与 Dart 的市场应用

本文来自《2023年中国谷歌教育合作项目—武汉城市学院—面向Flutter框架的Dart语言师资培训与教学研讨》内容文字版。 Hello&#xff0c;大家好&#xff0c;我是 Flutter GDE 郭树煜&#xff0c;也是《Flutter 开发实战详解》的作者&#xff0c;同时也是 Github GSY 项目的负责…

VUE整合Echarts实现简单的数据可视化

提示&#xff1a;本篇案例使用的vue2 以及 vue cli脚手架&#xff1a; 文章目录 前言 一、Echarts的安装 二、可视化渲染 1.柱状图 2.饼图 3.主题的下载 总结 前言 ECharts是一款功能强大的前端数据可视化库&#xff0c;支持多种图表类型和统计图表、地理数据可视化、关系型…

超声波清洗机洗眼镜真的可以洗干净吗?眼镜超声波清洗机推荐

截止2023年4月份近视眼的统计&#xff0c;我过近视人群高达3亿人&#xff0c;可想而知现在近视的群体是有多么庞大的。近视就免不了要戴眼镜&#xff0c;但是一副眼镜长时间的佩戴不清洗的话&#xff0c;镜片会不清晰&#xff0c;也有的朋友会眼镜脏了就去配一副新的&#xff0…

【狂神说】HTML详解

目录 1 HTML概述1.1 什么是HTML1.2 HTML发展史1.3 HTML5的优势1.4 W3C标准 2 网页2.1 网页基本信息2.2 网页基本标签2.2.1 标题标签2.2.2 段落标签2.2.3 换行标签2.2.4 水平线标签2.2.5 字体样式标签&#xff1a;粗体、斜体2.2.6 注释和特殊符号 2.3 图像标签2.4 链接标签邮箱链…

MapGIS 10.6 Pro自主创新技术升级,护航国产化应用全面替代

信创GIS的发展历经雏形起步阶段&#xff08;2006-2013年&#xff09;、初步试点阶段&#xff08;2014-2017年&#xff09;、规模化试点阶段&#xff08;2017-2019年&#xff09;&#xff0c;目前正处在全面应用推广的新阶段&#xff08;2020年至今&#xff09;&#xff0c;当前…

九州未来参与编制的《基于C-V2X的智能化网联化融合发展路线图》正式发布!

近日&#xff0c;《基于C-V2X的智能化网联化融合发展路线图&#xff08;征求意见稿&#xff09;》在2023世界智能网联汽车大会上正式发布。 路线图在多位院士和众多行业专家指导下&#xff0c;由四十余家相关企业、高校、研究机构共同研究编制&#xff0c;十四家跨行业学会、联…