命名空间
变体
操作

logb、logbf、logbl

来自 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)
(C99)(C23)
logb
(C99)
缩窄运算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
全序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
定义在头文件 <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

形式上,无偏指数是 log
r
|arg|
(由此函数作为浮点值返回)的带符号整数部分,对于非零 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 函数 (p: TBD)
  • 7.25 类型通用数学 <tgmath.h> (p: TBD)
  • F.10.3.11 logb 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.6.11 logb 函数 (p: 179-180)
  • 7.25 类型通用数学 <tgmath.h> (p: 373-375)
  • F.10.3.11 logb 函数 (p: 381)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.6.11 logb 函数 (p: 246)
  • 7.25 类型通用数学 <tgmath.h> (p: 373-375)
  • F.10.3.11 logb 函数 (p: 522)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.6.11 logb 函数 (p: 227)
  • 7.22 类型通用数学 <tgmath.h> (p: 335-337)
  • F.9.3.11 logb 函数 (p: 459)

[编辑] 另请参阅

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