Fpclassify
Defined in header <cmath>
.
Description
Categorizes floating point value num
into the following categories:
zero
,subnormal
,normal
,infinite
,NAN
,implementation-defined category
The library provides overloads of std::fpclassify for all cv-unqualified floating-point types as the type of the parameter num
(since C++23).
Additional Overloads are provided for all integer types, which are treated as double.
Declarations
- C++23
- C++11
// 1)
constexpr int fpclassify( /* floating-point-type */ num );
// 2)
template< class Integer >
constexpr int fpclassify( Integer num );
// 1)
int fpclassify( float num );
// 2)
int fpclassify( double num );
// 3)
int fpclassify( long double num );
// 4)
template< class Integer >
int fpclassify( Integer num );
Parameters
num
- floating-point or integer value
Return value
One of FP_INFINITE
, FP_NAN
, FP_NORMAL
, FP_SUBNORMAL
, FP_ZERO
or implementation-defined type
, specifying the category of num
.
Notes
The additional overloads are not required to be provided exactly as Additional Overloads.
They only need to be sufficient to ensure that for their argument num
of integer type,
std::fpclassify(num)
has the same effect as std::fpclassify(static_cast<double>(num))
.
Examples
#include <cfloat>
#include <cmath>
#include <iostream>
auto show_classification(double x)
{
switch (std::fpclassify(x))
{
case FP_INFINITE:
return "Inf";
case FP_NAN:
return "NaN";
case FP_NORMAL:
return "normal";
case FP_SUBNORMAL:
return "subnormal";
case FP_ZERO:
return "zero";
default:
return "unknown";
}
}
int main()
{
std::cout
<< "1.0/0.0 is "
<< show_classification(1 / 0.0) << '\n'
<< "0.0/0.0 is "
<< show_classification(0.0 / 0.0) << '\n'
<< "DBL_MIN/2 is "
<< show_classification(DBL_MIN / 2) << '\n'
<< "-0.0 is "
<< show_classification(-0.0) << '\n'
<< "1.0 is "
<< show_classification(1.0) << '\n';
}
1.0/0.0 is Inf
0.0/0.0 is NaN
DBL_MIN/2 is subnormal
-0.0 is zero
1.0 is normal