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

正式而言,无偏指数是非零 arglog
r
|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("给定数值 %.2f 十六进制为 %a,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() 计算 %.0f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() 计算 %f * 2^%d\n", f2, i);
 
    i = logb(f);
    printf("logb()/logb() 计算 %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // 错误处理
    feclearexcept(FE_ALL_EXCEPT);
    printf("logb(0) = %f\n", logb(0));
    if (fetestexcept(FE_DIVBYZERO))
        puts("    FE_DIVBYZERO raised");
}

可能的输出:

给定数值 123.45 十六进制为 0x1.edccccccccccdp+6,
modf() 计算 123 + 0.45
frexp() 计算 0.964453 * 2^7
logb()/logb() 计算 1.928906 * 2^6
logb(0) = -Inf
    FE_DIVBYZERO raised

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.12.6.11 The logb functions (第 TBD 页)
  • 7.25 Type-generic math <tgmath.h> (第 TBD 页)
  • F.10.3.11 The logb functions (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.12.6.11 The logb functions (第 179-180 页)
  • 7.25 Type-generic math <tgmath.h> (第 373-375 页)
  • F.10.3.11 The logb functions (第 381 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.12.6.11 The logb functions (第 246 页)
  • 7.25 Type-generic math <tgmath.h> (第 373-375 页)
  • F.10.3.11 The logb functions (第 522 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.12.6.11 The logb functions (第 227 页)
  • 7.22 Type-generic math <tgmath.h> (第 335-337 页)
  • F.9.3.11 The logb functions (第 459 页)

参阅

将数拆分成有效数字和 2 的幂次
(函数)
(C99)(C99)(C99)
提取给定数的指数(结果为整数)
(函数)
(C99)(C99)(C99)(C99)(C99)(C99)
高效计算一个数乘 FLT_RADIX 的幂
(函数)