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++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c