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++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数