命名空间
变体
操作

ilogb, ilogbf, ilogbl

来自 cppreference.cn
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(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) (since C99)
int ilogb( double arg );
(2) (since C99)
int ilogbl( long double arg );
(3) (since C99)
定义于头文件 <tgmath.h>
#define ilogb( arg )
(4) (since C99)
定义于头文件 <math.h>
#define FP_ILOGB0    /* implementation-defined */
(5) (since C99)
#define FP_ILOGBNAN  /* implementation-defined */
(6) (since 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 的无偏指数将作为带符号的 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),

  • 如果正确结果大于 INT_MAX 或小于 INT_MIN,则引发 FE_INVALID
  • 如果 arg 是 ±0、±∞ 或 NaN,则引发 FE_INVALID
  • 在所有其他情况下,结果是精确的(永远不会引发 FE_INEXACT),并且当前的舍入模式被忽略。

[编辑] 注释

如果 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 standard (ISO/IEC 9899:2024)
  • 7.12/8 Mathematics <math.h> (p: TBD)
  • 7.12.6.5 The ilogb functions (p: TBD)
  • 7.25 Type-generic math <tgmath.h> (p: TBD)
  • F.10.3.5 The ilogb functions (p: TBD)
  • C17 standard (ISO/IEC 9899:2018)
  • 7.12/8 Mathematics <math.h> (p: TBD)
  • 7.12.6.5 The ilogb functions (p: TBD)
  • 7.25 Type-generic math <tgmath.h> (p: TBD)
  • F.10.3.5 The ilogb functions (p: TBD)
  • C11 standard (ISO/IEC 9899:2011)
  • 7.12/8 Mathematics <math.h> (p: 232)
  • 7.12.6.5 The ilogb functions (p: 244)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.3.5 The ilogb functions (p: 521)
  • C99 standard (ISO/IEC 9899:1999)
  • 7.12/8 Mathematics <math.h> (p: 213)
  • 7.12.6.5 The ilogb functions (p: 224-225)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.3.5 The ilogb functions (p: 458)

[编辑] 参见

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