std::numeric_limits<T>:: tinyness_before
From cppreference.net
<
cpp
|
types
|
numeric limits
|
static
const
bool
tinyness_before
;
|
(C++11 前) | |
|
static
constexpr
bool
tinyness_before
;
|
(C++11 起) | |
对于所有在舍入前检测浮点表达式结果是否下溢的浮点类型
T
,
std::
numeric_limits
<
T
>
::
tinyness_before
的值为
true
。
目录 |
标准特化
T
|
std:: numeric_limits < T > :: tinyness_before 的值 |
| /* non-specialized */ | false |
| bool | false |
| char | false |
| signed char | false |
| unsigned char | false |
| wchar_t | false |
| char8_t (since C++20) | false |
| char16_t (since C++11) | false |
| char32_t (since C++11) | false |
| short | false |
| unsigned short | false |
| int | false |
| unsigned int | false |
| long | false |
| unsigned long | false |
| long long (since C++11) | false |
| unsigned long long (since C++11) | false |
| float | 由实现定义 |
| double | 由实现定义 |
| long double | 由实现定义 |
注释
符合标准的IEEE 754浮点实现需要检测浮点下溢,并存在两种可执行此操作的替代情况
- 当计算结果的绝对值(按指数范围和精度均无限制的情况计算)小于 std:: numeric_limits < T > :: min ( ) 时,会发生下溢(并可能引发 FE_UNDERFLOW )。此类实现在舍入前检测微小值(例如 UltraSparc、POWER)。
- 当结果舍入到目标浮点类型后(即舍入至 std:: numeric_limits < T > :: digits 位),结果的绝对值小于 std:: numeric_limits < T > :: min ( ) 时,会发生下溢(并可能引发 FE_UNDERFLOW )。形式化表述为:按指数范围无限制计算得到的非零结果的绝对值小于 std:: numeric_limits < T > :: min ( ) 。此类实现在舍入后检测微小值(例如 SuperSparc)。
示例
最大次正规数乘以比1.0大一个机器epsilon的数,在舍入前得到极小的值0x0.fffffffffffff8p-1022,但舍入后得到正规值1p-1022。执行此测试的实现( IBM Power7 )在舍入前检测到微小性。
运行此代码
#include <iostream> #include <limits> #include <cmath> #include <cfenv> int main() { std::cout << "Tinyness before: " << std::boolalpha << std::numeric_limits<double>::tinyness_before << '\n'; double denorm_max = std::nextafter(std::numeric_limits<double>::min(), 0); double multiplier = 1 + std::numeric_limits<double>::epsilon(); std::feclearexcept(FE_ALL_EXCEPT); double result = denorm_max * multiplier; // Underflow only if tinyness_before if (std::fetestexcept(FE_UNDERFLOW)) std::cout << "Underflow detected\n"; std::cout << std::hexfloat << denorm_max << " x " << multiplier << " = " << result << '\n'; }
可能的输出:
Tinyness before: true Underflow detected 0xf.ffffffffffffp-1030 x 0x1.0000000000001p+0 = 0x1p-1022
参见
|
[static]
|
标识将精度损失检测为非规范化损失而非不精确结果的浮点类型
(公开静态成员常量) |
|
[static]
|
标识浮点类型使用的非规范化风格
(公开静态成员常量) |