|
|
Basic types | |||||||||||||||||||||
Fixed width integer types(C++11) | |||||||||||||||||||||
Fixed width floating-point types(C++23) | |||||||||||||||||||||
| |||||||||||||||||||||
Numeric limits | |||||||||||||||||||||
C numeric limits interface | |||||||||||||||||||||
Runtime type information | |||||||||||||||||||||
|
Static constants | ||||
(C++11) | ||||
numeric_limits::tinyness_before | ||||
Static member functions | ||||
(C++11) | ||||
Helper types | ||||
staticconstbool tinyness_before; | (until C++11) | |
staticconstexprbool tinyness_before; | (since C++11) | |
The value ofstd::numeric_limits<T>::tinyness_before istrue for all floating-point typesT
that test results of floating-point expressions for underflow before rounding.
Contents |
T | value ofstd::numeric_limits<T>::tinyness_before |
/* non-specialized */ | false |
bool | false |
char | false |
signedchar | false |
unsignedchar | false |
wchar_t | false |
char8_t(since C++20) | false |
char16_t(since C++11) | false |
char32_t(since C++11) | false |
short | false |
unsignedshort | false |
int | false |
unsignedint | false |
long | false |
unsignedlong | false |
longlong(since C++11) | false |
unsignedlonglong(since C++11) | false |
float | implementation-defined |
double | implementation-defined |
longdouble | implementation-defined |
Standard-compliant IEEE 754 floating-point implementations are required to detect the floating-point underflow, and have two alternative situations where this can be done
Multiplication of the largest subnormal number by the number one machine epsilon greater than 1.0 gives the tiny value 0x0.fffffffffffff8p-1022 before rounding, but normal value 1p-1022 after rounding. The implementation used to execute this test (IBM Power7) detects tinyness before rounding.
#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';}
Possible output:
Tinyness before: trueUnderflow detected0xf.ffffffffffffp-1030 x 0x1.0000000000001p+0 = 0x1p-1022
[static] | identifies the floating-point types that detect loss of precision as denormalization loss rather than inexact result (public static member constant)[edit] |
[static] | identifies the denormalization style used by the floating-point type (public static member constant)[edit] |