C++官网参考链接:https://cplusplus.com/reference/cmath/ilogb/
函数
<cmath> <ctgmath>
ilogb
C99
int ilogb(double x);
int ilogbf(float x);
int ilogbl(long double x);
C++11
int ilogb(double x);
int ilogb(float x);
int ilogb(long double x);
int ilogb (T x); // additional overloads for integral types
计算以浮点基数为底数的对数
返回|x|的对数的整数部分,使用FLT_RADIX作为对数的底数。
这是机器内部用来表示浮点值x的指数,当它使用1.0到FLT_RADIX之间的有效值时,因此,对于正的x:
x = 有效值 * FLT_RADIX^指数
通常,FLT_RADIX为2,该函数返回的值比frexp获得的指数小1(由于不同的有效值规范化为[1.0,2.0)而不是[0.5,1.0))。
C99
头文件<tgmath.h>提供了该函数的泛型类型的宏版本。
C++11
在此头文件(<cmath>)中为整型(integral types:)提供了额外的重载:这些重载在计算之前有效地将x转换为double类型(定义为T为任何整型(integral types:))。
这个函数可以返回两个特定的宏常量来表示以下特殊情况:
macro(宏) | description(描述) |
---|---|
FP_ILOGB0 | x is zero(x是零) |
FP_ILOGBNAN | x is NaN(x不是一个数) |
这些宏常量在同一个头文件(<cmath>)中定义。
形参
x
返回x的ilogb的值。
返回值
如果x是正常值(is normal),则返回x的基于FLT_RADIX的对数。
如果x是非正常值,则返回的值对应于规范化表示(负指数)。
如果x为0,则返回FP_LOGB0(一个特殊值,仅由此函数返回,定义在<cmath>中)。
如果x是无穷的,则返回INT_MAX。
如果x是NaN,则返回FP_ILOGBNAN(一个特殊值,仅由此函数返回,定义在<cmath>中)。
如果结果的绝对大小太大,无法用返回类型的值表示,则函数返回未指定的值,并发生上溢范围错误。
x为0、无穷或NaN值也可能导致定义域错误或上溢范围错误。
如果发生定义域错误:
—math_errhandling具有MATH_ERRNO集合:全局变量errno设置为EDOM。
—math_errhandling具有MATH_ERREXCEPT集合:将引发FE_INVALID。
如果发生上溢范围错误:
—math_errhandling具有MATH_ERRNO集合:全局变量errno设置为ERANGE。
—math_errhandling具有MATH_ERREXCEPT集合:引发FE_OVERFLOW。
用例
/* ilogb example */
#include <stdio.h> /* printf */
#include <math.h> /* ilogb */
int main ()
{
double param;
int result;
param = 10.0;
result = ilogb (param);
printf ("ilogb(%f) = %d\n", param, result);
return 0;
}
输出: