非常教程

C参考手册

数值 | Numerics

ilogbf

在头文件<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,其中r是FLT_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)。

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

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)。

std :: ilogb返回的指数的值总是比由frexp返回的指数小1,这是因为归一化要求不同:对于由ilogb返回的指数e,| arg * r-e

| 介于1和r之间(通常介于1和2之间),但对于由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);
 
    // 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

参考

  • 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)

扩展内容

frexpfrexpffrexpl(C99)(C99)

将数字分为有效数和2(功能)

logblogbflogbl(C99)(C99)(C99)

提取给定数字的指数(函数)

scalbnscalbnfscalbnlscalblnscalblnfscalblnl(C99)(C99)(C99)(C99)(C99)(C99)

有效计算FLT_RADIX提升到功率(功能)的次数

| 用于ilogb的C ++文档 |

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。