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

相关文章

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Python中Flask模板的使用与高级技巧详解

《Python中Flask模板的使用与高级技巧详解》在Web开发中,直接将HTML代码写在Python文件中会导致诸多问题,Flask内置了Jinja2模板引擎,完美解决了这些问题,下面我们就来看看F... 目录一、模板渲染基础1.1 为什么需要模板引擎1.2 第一个模板渲染示例1.3 模板渲染原理二、模板

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Spring Boot中JSON数值溢出问题从报错到优雅解决办法

《SpringBoot中JSON数值溢出问题从报错到优雅解决办法》:本文主要介绍SpringBoot中JSON数值溢出问题从报错到优雅的解决办法,通过修改字段类型为Long、添加全局异常处理和... 目录一、问题背景:为什么我的接口突然报错了?二、为什么会发生这个错误?1. Java 数据类型的“容量”限制

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文