Common mathematical functions | |||||||||||||||||||||||||||||||
Mathematical special functions(C++17) | |||||||||||||||||||||||||||||||
Mathematical constants(C++20) | |||||||||||||||||||||||||||||||
Basic linear algebra algorithms(C++26) | |||||||||||||||||||||||||||||||
Data-parallel types (SIMD)(C++26) | |||||||||||||||||||||||||||||||
Floating-point environment(C++11) | |||||||||||||||||||||||||||||||
Complex numbers | |||||||||||||||||||||||||||||||
Numeric array (valarray ) | |||||||||||||||||||||||||||||||
Pseudo-random number generation | |||||||||||||||||||||||||||||||
Bit manipulation(C++20) | |||||||||||||||||||||||||||||||
Saturation arithmetic(C++26) | |||||||||||||||||||||||||||||||
Factor operations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
Interpolations | |||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
Generic numeric operations | |||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||
C-style checked integer arithmetic | |||||||||||||||||||||||||||||||
|
Nearest integer floating point operations | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
Floating point manipulation functions | |||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||
Classification and comparison | |||||||||||||||||||||||||||||||||||||||||
| |||||||||||||||||||||||||||||||||||||||||
Types | |||||||||||||||||||||||||||||||||||||||||
Macro constants | |||||||||||||||||||||||||||||||||||||||||
|
|
Defined in header <cmath> | ||
(1) | ||
float logb(float num); double logb(double num); | (until C++23) | |
constexpr/*floating-point-type*/ logb(/*floating-point-type*/ num); | (since C++23) | |
float logbf(float num); | (2) | (since C++11) (constexpr since C++23) |
longdouble logbl(longdouble num); | (3) | (since C++11) (constexpr since C++23) |
SIMD overload(since C++26) | ||
Defined in header <simd> | ||
template</*math-floating-point*/ V> constexpr/*deduced-simd-t*/<V> | (S) | (since C++26) |
Additional overloads(since C++11) | ||
Defined in header <cmath> | ||
template<class Integer> double logb( Integer num); | (A) | (constexpr since C++23) |
std::logb
for all cv-unqualified floating-point types as the type of the parameter.(since C++23)S) The SIMD overload performs an element-wise std::logb onv_num.
| (since C++26) |
A) Additional overloads are provided for all integer types, which are treated asdouble. | (since C++11) |
Formally, the unbiased exponent is the signed integral part oflogr|num| (returned by this function as a floating-point value), for non-zeronum, wherer isstd::numeric_limits<T>::radix andT
is the floating-point type ofnum. Ifnum is subnormal, it is treated as though it was normalized.
Contents |
num | - | floating-point or integer value |
If no errors occur, the unbiased exponent ofnum is returned as a signed floating-point value.
If a domain error occurs, an implementation-defined value is returned.
If a pole error occurs,-HUGE_VAL,-HUGE_VALF
, or-HUGE_VALL
is returned.
Errors are reported as specified inmath_errhandling.
Domain or range error may occur ifnum is zero.
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
POSIX requires that a pole error occurs ifnum is ±0.
The value of the exponent returned bystd::logb
is always 1 less than the exponent returned bystd::frexp because of the different normalization requirements: for the exponente returned bystd::logb
,|num*r-e
| is between1 andr (typically between1 and2), but for the exponente returned bystd::frexp,|num*2-e
| is between0.5 and1.
The additional overloads are not required to be provided exactly as(A). They only need to be sufficient to ensure that for their argumentnum of integer type,std::logb(num) has the same effect asstd::logb(static_cast<double>(num)).
Compares different floating-point decomposition functions:
#include <cfenv>#include <cmath>#include <iostream>#include <limits>// #pragma STDC FENV_ACCESS ON int main(){double f=123.45;std::cout<<"Given the number "<< f<<" or "<<std::hexfloat<< f<<std::defaultfloat<<" in hex,\n"; double f3;double f2=std::modf(f,&f3);std::cout<<"modf() makes "<< f3<<" + "<< f2<<'\n'; int i; f2=std::frexp(f,&i);std::cout<<"frexp() makes "<< f2<<" * 2^"<< i<<'\n'; i=std::ilogb(f);std::cout<<"logb()/ilogb() make "<< f/std::scalbn(1.0, i)<<" * "<<std::numeric_limits<double>::radix<<"^"<<std::ilogb(f)<<'\n'; // error handlingstd::feclearexcept(FE_ALL_EXCEPT); std::cout<<"logb(0) = "<< std::logb(0)<<'\n';if(std::fetestexcept(FE_DIVBYZERO))std::cout<<" FE_DIVBYZERO raised\n";}
Possible output:
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,modf() makes 123 + 0.45frexp() makes 0.964453 * 2^7logb()/ilogb() make 1.92891 * 2^6logb(0) = -Inf FE_DIVBYZERO raised
(C++11)(C++11) | decomposes a number into significand and base-2 exponent (function)[edit] |
(C++11)(C++11)(C++11) | extracts exponent of the number (function)[edit] |
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11) | multiplies a number byFLT_RADIX raised to a power (function)[edit] |
C documentation forlogb |