GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::ilogb,std::ilogbf,std::ilogbl(3) C++ Standard Libary std::ilogb,std::ilogbf,std::ilogbl(3)

std::ilogb,std::ilogbf,std::ilogbl - std::ilogb,std::ilogbf,std::ilogbl


Defined in header <cmath>
int ilogb ( float arg ); (1) (since C++11)
int ilogbf( float arg ); (constexpr since C++23)
int ilogb ( double arg ); (2) (since C++11)
(constexpr since C++23)
int ilogb ( long double arg ); (3) (since C++11)
int ilogbl( long double arg ); (constexpr since C++23)
int ilogb ( IntegralType arg ); (4) (since C++11)
(constexpr since C++23)
#define FP_ILOGB0 /*implementation-defined*/ (5) (since C++11)
#define FP_ILOGBNAN /*implementation-defined*/ (6) (since C++11)


1-3) Extracts the value of the unbiased exponent from the floating-point argument
arg, and returns it as a signed integer value.
4) A set of overloads or a function template accepting an argument of any integral
type. Equivalent to (2) (the argument is cast to double).
5) Expands to integer constant expression whose value is either INT_MIN or -INT_MAX.
6) Expands to integer constant expression whose value is either INT_MIN or +INT_MAX.


Formally, the unbiased exponent is the integral part of log
r|arg| as a signed integral value, for non-zero arg, where r is
std::numeric_limits<T>::radix and T is the floating-point type of arg.


arg - floating point value


If no errors occur, the unbiased exponent of arg is returned as a signed int value.


If arg is zero, FP_ILOGB0 is returned.


If arg is infinite, INT_MAX is returned.


If arg is a NaN, FP_ILOGBNAN is returned.


If the correct result is greater than INT_MAX or smaller than INT_MIN, the return
value is unspecified.


Errors are reported as specified in math_errhandling.


A domain error or range error may occur if arg is zero, infinite, or NaN.


If the correct result is greater than INT_MAX or smaller than INT_MIN, a domain
error or a range error may occur


If the implementation supports IEEE floating-point arithmetic (IEC 60559),


* If the correct result is greater than INT_MAX or smaller than INT_MIN,
FE_INVALID is raised.
* If arg is ±0, ±∞, or NaN, FE_INVALID is raised.
* In all other cases, the result is exact (FE_INEXACT is never raised) and the
current rounding mode is ignored


If arg is not zero, infinite, or NaN, the value returned is exactly equivalent to
static_cast<int>(std::logb(arg))


POSIX requires that a domain error occurs if arg is zero, infinite, NaN, or if the
correct result is outside of the range of int.


POSIX also requires that, on XSI-conformant systems, the value returned when the
correct result is greater than INT_MAX is INT_MAX and the value returned when the
correct result is less than INT_MIN is INT_MIN.


The correct result can be represented as int on all known implementations. For
overflow to occur, INT_MAX must be less than LDBL_MAX_EXP*log2(FLT_RADIX) or INT_MIN
must be greater than LDBL_MIN_EXP-LDBL_MANT_DIG)*log2(FLT_RADIX).


The value of the exponent returned by std::ilogb is always 1 less than the exponent
retuned by std::frexp because of the different normalization requirements: for the
exponent e returned by std::ilogb, |arg*r-e
| is between 1 and r (typically between 1 and 2), but for the exponent e returned by
std::frexp, |arg*2-e
| is between 0.5 and 1.


Compares different floating-point decomposition functions

// Run this code


#include <iostream>
#include <cmath>
#include <limits>
#include <cfenv>


// #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 handling
std::feclearexcept(FE_ALL_EXCEPT);
std::cout << "ilogb(0) = " << std::ilogb(0) << '\n';
if (std::fetestexcept(FE_INVALID))
std::cout << " FE_INVALID raised\n";
}


Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
ilogb(0) = -2147483648
FE_INVALID raised


frexp
frexpf decomposes a number into significand and a power of 2
frexpl (function)
(C++11)
(C++11)
logb
logbf
logbl extracts exponent of the number
(C++11) (function)
(C++11)
(C++11)
scalbn
scalbnf
scalbnl
scalbln
scalblnf
scalblnl multiplies a number by FLT_RADIX raised to a power
(C++11) (function)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.