frexp, frexpf, frexpl

来自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)
浮点操作函数
frexp
(C99)(C99)
(C99)(C23)
(C99)
窄化运算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量与量指数函数
十进制重编码函数
全序与载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数与返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
在标头 <math.h> 定义
float       frexpf( float arg, int* exp );
(1) (C99 起)
double      frexp( double arg, int* exp );
(2)
long double frexpl( long double arg, int* exp );
(3) (C99 起)
在标头 <tgmath.h> 定义
#define frexp( arg, exp )
(4) (C99 起)
1-3) 分解给定的浮点值 x 为正规化小数和二的整数幂。
4) 泛型宏:若 arg 拥有 long double 类型,则调用 frexpl。否则,若 arg 拥有整数类型或 double 类型,则调用 frexp。否则调用 frexpf

参数

arg - 浮点值
exp - 指向要存储指数到的整数的指针

返回值

arg 为零,则返回零并存储零于 *exp

否则(若 arg 非零),若不出现错误,则返回范围 (-1;-0.5], [0.5; 1) 中的值 x,并存储整数值为 *exp,满足 x×2(*exp)
=arg

若存储于 *exp 的值在 int 范围外,则行为未指定。

arg 不是浮点数,则行为未指定。

错误处理

此函数不受制于任何指定于 math_errhandling 的错误。

若实现支持 IEEE 浮点算术(IEC 60559),则

  • arg 为 ±0,则返回不修改的参数,并存储 0*exp
  • arg 为 ±∞,则返回它,并存储未指定值于 *exp
  • arg 为 NaN,则返回 NaN,并存储未指定值于 *exp
  • 不引发浮点异常。
  • FLT_RADIX2(或 2 的幂),则返回值准确,忽略当前舍入模式

注解

二进制系统(其中 FLT_RADIX2)上,frexp 可实现为

{
    *exp = (value == 0) ? 0 : (int)(1 + logb(value));
    return scalbn(value, -(*exp));
}

函数 frexp 与其对偶 ldexp 能一起用于操纵浮点数的表示,而无需直接的位操作。

示例

#include <float.h>
#include <math.h>
#include <stdio.h>
 
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 = ilogb(f);
    printf("logb()/ilogb() 计算 %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
}

可能的输出:

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

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.12.6.4 The frexp functions (第 TBD 页)
  • 7.25 Type-generic math <tgmath.h> (第 TBD 页)
  • F.10.3.4 The frexp functions (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.12.6.4 The frexp functions (第 TBD 页)
  • 7.25 Type-generic math <tgmath.h> (第 TBD 页)
  • F.10.3.4 The frexp functions (第 TBD 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.12.6.4 The frexp functions (第 243 页)
  • 7.25 Type-generic math <tgmath.h> (第 373-375 页)
  • F.10.3.4 The frexp functions (第 521 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.12.6.4 The frexp functions (第 224 页)
  • 7.22 Type-generic math <tgmath.h> (第 335-337 页)
  • F.9.3.4 The frexp functions (第 458 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.5.4.2 The frexp function

参阅

将数乘以 2 的幂
(函数)
(C99)(C99)(C99)
提取给定数的指数(结果为浮点数)
(函数)
(C99)(C99)(C99)
提取给定数的指数(结果为整数)
(函数)
(C99)(C99)
把一个数拆分成整数和小数部分
(函数)