ilogb, ilogbf, ilogbl

< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数函数
(C99)
(C99)
(C99)
(C99)
幂函数
(C99)
(C99)
三角及双曲函数
(C99)
(C99)
(C99)
误差及伽马函数
(C99)
(C99)
(C99)
(C99)
临近整数的浮点运算
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮点数操作函数
(C99)(C99)
ilogb
(C99)
(C99)
分类
(C99)
(C99)
(C99)
类型
(C99)(C99)
宏常量
(C99)
FP_ILOGB0FP_ILOGBNAN
(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 /*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 的 log
r
|arg|
的整数部分,作为有符号整数值,其中 rFLT_RADIX

参数

arg - 浮点值

返回值

若不出现错误,则返回作为 int 值的 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 <stdio.h>
#include <math.h>
#include <float.h>
#include <fenv.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);
 
    // 错误处理
    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

引用

  • 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 的幂次
(函数)
(C99)(C99)(C99)
提取给定数的指数(结果为浮点数)
(函数)
(C99)(C99)(C99)(C99)(C99)(C99)
高效计算一个数乘 FLT_RADIX 的幂
(函数)