C++学习笔记(2)std::numeric_limits数值极限模板类的使用

简介

std::numeric_limits类模板定义在头文件<limits>中,提供查询多种算术类型的属性的标准化方式
比如int类型的最大值为std::numeric_limits<int>::max()
如何提供这些信息呢?
模板特化!
标准库为所有的类模板都制定可用的特化,例如:
在这里插入图片描述

  1. std::numeric_limits 针对有 cv(constant value) 限定的类型 cv T 的特化的每个成员的值都与对无 cv 限定的类型 T 的特化的对应成员的值相同。例如 std::numeric_limits<int>::digits 等于std::numeric_limits<const int>::digits
  2. 算术类型的别名(例如 std::size_t 或 std::streamsize)也可以用 std::numeric_limits 类型特征予以检测。
  3. 非算术标准类型,例如 std::complex<T>std::nullptr_t,没有特化。
  4. 实现可以对实现特定的类型提供 std::numeric_limits 的特化:例如 GCC 提供 std::numeric_limits<__int128>。非标准的库可以为库所提供的类型添加特化,例如 OpenEXR 为 16 位浮点数类型提供 std::numeric_limits<half>

模板参数

template< class T > class numeric_limits;

T为要获取数值属性的类型

成员常量

挑几个讲

is_specialized

在这里插入图片描述

has_quiet_NaN

是否为静默非数(可以在错误的计算中传播下去,方便后续处理或调试,如果为signaling NaN会直接抛出异常)
只有浮点型才有NaN,has_quiet_NaN用于鉴别该浮点型能不能表示quiet NaN
在这里插入图片描述

bool 类型常量

在这里插入图片描述

数值类型常量

在这里插入图片描述

成员函数

在这里插入图片描述

max

在这里插入图片描述

infinity

在这里插入图片描述

quiet_NaN

在这里插入图片描述

辅助类

在这里插入图片描述

如何根据自己的需要对模板进行特化?

在这里插入图片描述

static!

constexpr!

### C++ 中 `std::numeric_limits` 的用法和含义 #### 定义与作用 `std::numeric_limits` 是位于头文件 `<limits>` 中的一个模板类,用于提供各种基本数据类型的极限值和其他属性。通过这个工具可以获取不同类型的最大最小值以及一些特性信息[^1]。 对于每一种内置数值型别(如 int, float),都有相应的特化版本定义了该类型的各种性质。这使得程序能够动态查询编译器所支持的数据范围而不必依赖于特定平台的具体实现细节[^2]。 #### 常见成员函数及其意义 - **min() 和 max():** 返回指定类型能表示的最小正值和最大有限值。 ```cpp std::cout << "int min value: " << std::numeric_limits<int>::min() << '\n'; std::cout << "int max value: " << std::numeric_limits<int>::max() << '\n'; ``` - **lowest():** 对浮点数返回负无穷大之外最接近负无穷大的可表示值;对整数则等同于 min(). ```cpp double d_lowest = std::numeric_limits<double>::lowest(); ``` - **epsilon():** 表示两个相邻可区分浮点数之间的差额,在评估精度损失时非常有用。 ```cpp float f_epsilon = std::numeric_limits<float>::epsilon(); ``` - **infinity(), has_infinity:** 判断是否支持正无穷并获得其代表形式。 ```cpp bool supports_inf = std::numeric_limits<double>::has_infinity; if (supports_inf) { double inf_value = std::numeric_limits<double>::infinity(); } ``` - **quiet_NaN(), signaling_NaN(), has_quiet_NaN, has_signaling_NaN:** 获取不同种类非数字(NaN)值的支持情况及具体表现形式。 ```cpp bool quiet_nan_supported = std::numeric_limits<double>::has_quiet_NaN; if (quiet_nan_supported) { double qnan = std::numeric_limits<double>::quiet_NaN(); } ``` 这些功能不仅限于此列表中的几个例子,还包括许多其他有用的静态常量和方法来描述给定类型的特征[^3]。 #### 实际应用场景 当编写跨平台的应用程序或者库的时候,使用 `std::numeric_limits` 可以帮助开发者确保代码不会因为不同的硬件架构或操作系统而出现问题。例如,在处理大数据集时防止溢出错误,或是设计算法时考虑数值稳定性和精确度的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值