命名空间
变体
操作

logb, logbf, logbl

来自 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)
(C99)(C23)
logb
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数
十进制重编码函数
总顺序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
误差和伽玛函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点数值
(C99)(C23)
参数和返回值
错误处理
快速操作指示器
 
定义于头文件 <math.h>
float       logbf( float arg );
(1) (自 C99 起)
double      logb( double arg );
(2) (自 C99 起)
long double logbl( long double arg );
(3) (自 C99 起)
定义于头文件 <tgmath.h>
#define logb( arg )
(4) (自 C99 起)
1-3) 从浮点参数 arg 中提取无偏的与基数无关的指数值,并将其作为浮点值返回。
4) 类型泛型宏:如果 arg 具有类型 long double,则调用 logbl。否则,如果 arg 具有整数类型或类型 double,则调用 logb。否则,调用 logbf

形式上,对于非零 arg,无偏指数是 logr|arg| 的有符号整数部分(由此函数作为浮点值返回),其中 rFLT_RADIX。如果 arg 是次正规的,则将其视为已正规化。

目录

[编辑] 参数

arg - 浮点数值

[编辑] 返回值

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

如果发生域错误,则返回实现定义的数值。

如果发生极点错误,则返回 -HUGE_VAL-HUGE_VALF-HUGE_VALL

[编辑] 错误处理

错误将按照 math_errhandling 中的规定报告。

如果 arg 为零,则可能发生域或范围错误。

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

  • 如果 arg 为 ±0,则返回 -∞ 并引发 FE_DIVBYZERO
  • 如果 arg 为 ±∞,则返回 +∞。
  • 如果 arg 为 NaN,则返回 NaN。
  • 在所有其他情况下,结果都是精确的(永远不会引发 FE_INEXACT),并且 当前的舍入模式 将被忽略。

[编辑] 注解

POSIX 要求,如果 arg 为 ±0,则会发生极点错误。

logb 返回的指数值始终比 frexp 返回的指数值小 1,因为归一化要求不同:对于 logb 返回的指数 e|arg*r-e
|
介于 1r 之间(通常介于 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 = logb(f);
    printf("logb()/logb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("logb(0) = %f\n", logb(0));
    if (fetestexcept(FE_DIVBYZERO))
        puts("    FE_DIVBYZERO raised");
}

可能的输出

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/logb() make 1.928906 * 2^6
logb(0) = -Inf
    FE_DIVBYZERO raised

[编辑] 参考文献

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12.6.11 logb 函数 (页码:待定)
  • 7.25 类型泛型数学 <tgmath.h> (页码:待定)
  • F.10.3.11 logb 函数 (页码:待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.6.11 logb 函数 (页码:179-180)
  • 7.25 类型泛型数学 <tgmath.h> (页码:373-375)
  • F.10.3.11 logb 函数 (页码:381)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.6.11 logb 函数 (页码:246)
  • 7.25 类型泛型数学 <tgmath.h> (页码:373-375)
  • F.10.3.11 logb 函数 (页码:522)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.6.11 logb 函数 (页码:227)
  • 7.22 类型泛型数学 <tgmath.h> (页码:335-337)
  • F.9.3.11 logb 函数 (页码:459)

[编辑] 参见

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