命名空间
变体
操作

ilogb、ilogbf、ilogbl

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C23)    
指数函数
(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)
(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)(C23)
参数和返回值
FP_ILOGB0FP_ILOGBNAN
(C99)(C99)
FP_LLOGB0FP_LLOGBNAN
(C23)(C23)
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
在头文件 <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    /* 实现定义的 */
(5) (自 C99 起)
#define FP_ILOGBNAN  /* 实现定义的 */
(6) (自 C99 起)
1-3) 从浮点参数 arg 中提取无偏指数的值,并将其作为有符号整数值返回。
4) 类型通用宏:如果 arg 的类型为 long double,则调用 ilogbl。否则,如果 arg 的类型为整数类型或类型 double,则调用 ilogb。否则,调用 ilogbf
5) 展开为整型常量表达式,其值为 INT_MIN-INT_MAX
6) 展开为整型常量表达式,其值为 INT_MIN+INT_MAX

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

内容

[编辑] 参数

arg - 浮点值

[编辑] 返回值

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

如果 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: TBD)
  • 7.12.6.5 ilogb 函数 (p: TBD)
  • 7.25 类型泛型数学 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12/8 数学 <math.h> (p: TBD)
  • 7.12.6.5 ilogb 函数 (p: TBD)
  • 7.25 类型泛型数学 <tgmath.h> (p: TBD)
  • F.10.3.5 ilogb 函数 (p: TBD)
  • 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