命名空间
变体
操作

ilogb、ilogbf、ilogbl

来自 cppreference.cn
< c‎ | 数值‎ | 数学
 
 
 
常用数学函数
函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指数函数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
幂函数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角函数和双曲函数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最近整数浮点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点数操作
(C99)(C99)
ilogbllogb
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子与量子指数
十进制重新编码函数
总序和载荷函数
分类
(C99)
(C99)
(C99)
(C23)
误差函数和伽马函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
FP_ILOGB0FP_ILOGBNAN
(C99)(C99)
FP_LLOGB0FP_LLOGBNAN
(C23)(C23)
错误处理
快速操作指示符
 
定义于头文件 <math.h>
int ilogbf( float arg );
(1) (C99 起)
int ilogb( double arg );
(2) (C99 起)
int ilogbl( long double arg );
(3) (C99 起)
定义于头文件 <tgmath.h>
#define ilogb( arg )
(4) (C99 起)
定义于头文件 <math.h>
#define FP_ILOGB0    /* implementation-defined */
(5) (C99 起)
#define FP_ILOGBNAN  /* implementation-defined */
(6) (C99 起)
1-3) 从浮点参数 arg 中提取无偏指数的值,并将其作为带符号整数值返回。
4) 类型泛型宏:如果 arg 具有类型 long double,则调用 ilogbl。否则,如果 arg 具有整数类型或类型 double,则调用 ilogb。否则,调用 ilogbf
5) 扩展为整数常量表达式,其值为 INT_MIN-INT_MAX
6) 扩展为整数常量表达式,其值为 INT_MIN+INT_MAX

形式上,对于非零的 arg,无偏指数是 logr|arg| 的整数部分作为带符号整数值,其中 rFLT_RADIX

目录

[编辑] 参数

arg - 浮点值

[编辑] 返回值

如果没有错误发生,则 arg 的无偏指数作为带符号整数值返回。

如果 arg 为零,则返回 FP_ILOGB0

如果 arg 为无穷大,则返回 INT_MAX

如果 arg 是 NaN,则返回 FP_ILOGBNAN

如果正确结果大于 INT_MAX 或小于 INT_MIN,则返回值未指定,并且可能发生域错误或范围错误。

[编辑] 错误处理

错误按 math_errhandling 中指定的方式报告。

如果 arg 为零、无穷大或 NaN,则可能发生域错误或范围错误。

如果正确结果大于 INT_MAX 或小于 INT_MIN,则可能发生域错误或范围错误。

如果实现支持 IEEE 浮点运算 (IEC 60559),

[编辑] 注意

如果 arg 不是零、无穷大或 NaN,则返回的值与 (int)logb(arg) 完全等价。

POSIX 要求,如果 arg 为零、无穷大、NaN,或者正确结果超出 int 的范围,则发生域错误。

POSIX 还要求,在符合 XSI 的系统上,当正确结果大于 INT_MAX 时返回的值为 INT_MAX,当正确结果小于 INT_MIN 时返回的值为 INT_MIN

在所有已知实现上,正确结果都可以表示为 int。要发生溢出,INT_MAX 必须小于 LDBL_MAX_EXP * log2(FLT_RADIX),或者 INT_MIN 必须大于 LDBL_MIN_EXP - LDBL_MANT_DIG) * log2(FLT_RADIX)

ilogb 返回的指数值总是比 frexp 返回的指数值小 1,因为归一化要求不同:对于 ilogb 返回的指数 e|arg*r-e
|
介于 1 和 r 之间(通常介于 12 之间),但对于 frexp 返回的指数 e|arg*2-e
|
介于 0.51 之间。

[编辑] 示例

#include <fenv.h>
#include <float.h>
#include <math.h>
#include <stdio.h>
// #pragma STDC FENV_ACCESS ON
 
int main(void)
{
    double f = 123.45;
    printf("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.0f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = ilogb(f);
    printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("ilogb(0) = %d\n", ilogb(0));
    if (fetestexcept(FE_INVALID))
        puts("    FE_INVALID raised");
}

可能的输出

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

[编辑] 参考资料

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12/8 数学 <math.h> (p: 待定)
  • 7.12.6.5 ilogb 函数 (p: 待定)
  • 7.25 类型通用数学 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb 函数 (p: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12/8 数学 <math.h> (p: 待定)
  • 7.12.6.5 ilogb 函数 (p: 待定)
  • 7.25 类型通用数学 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb 函数 (p: 待定)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12/8 数学 <math.h> (p: 232)
  • 7.12.6.5 ilogb 函数 (p: 244)
  • 7.25 类型通用数学 <tgmath.h> (p: 373-375)
  • F.10.3.5 ilogb 函数 (p: 521)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12/8 数学 <math.h> (p: 213)
  • 7.12.6.5 ilogb 函数 (p: 224-225)
  • 7.22 类型通用数学 <tgmath.h> (p: 335-337)
  • F.9.3.5 ilogb 函数 (p: 458)

[编辑] 另请参阅

将一个数字分解为有效数字和2的幂
(函数) [编辑]
(C99)(C99)(C99)
提取给定数字的指数
(函数) [编辑]
(C99)(C99)(C99)(C99)(C99)(C99)
高效计算一个数字乘以 FLT_RADIX 的幂
(函数) [编辑]
C++ 文档 for ilogb