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++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Rust中的BoxT之堆上的数据与递归类型详解

《Rust中的BoxT之堆上的数据与递归类型详解》本文介绍了Rust中的BoxT类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用BoxT来实现递归类型和处理大小未知类型,通过BoxT,Rus... 目录1. Box<T> 的基础知识1.1 堆与栈的分工1.2 性能优势2.1 递归类型的问题2.2

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相