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

2023-10-17 02:52

本文主要是介绍C++标准模板(STL)- 类型支持 (数值极限,traps,tinyness_before),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数值极限

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;
}

输出

这篇关于C++标准模板(STL)- 类型支持 (数值极限,traps,tinyness_before)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/222463

相关文章

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

C++11委托构造函数和继承构造函数的实现

《C++11委托构造函数和继承构造函数的实现》C++引入了委托构造函数和继承构造函数这两个重要的特性,本文主要介绍了C++11委托构造函数和继承构造函数的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、委托构造函数1.1 委托构造函数的定义与作用1.2 委托构造函数的语法1.3 委托构造函

C++11作用域枚举(Scoped Enums)的实现示例

《C++11作用域枚举(ScopedEnums)的实现示例》枚举类型是一种非常实用的工具,C++11标准引入了作用域枚举,也称为强类型枚举,本文主要介绍了C++11作用域枚举(ScopedEnums... 目录一、引言二、传统枚举类型的局限性2.1 命名空间污染2.2 整型提升问题2.3 类型转换问题三、C

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手