命名空间
变体
操作

frexp, frexpf, frexpl

来自 cppreference.cn
< c‎ | 数值‎ | 数学
 
 
 
常用数学函数
函数
基本操作
(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)
浮点数操作
frexp
(C99)(C99)
(C99)(C23)
(C99)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子与量子指数
十进制重新编码函数
总序和载荷函数
分类
(C99)
(C99)
(C99)
(C23)
误差函数和伽马函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
错误处理
快速操作指示符
 
定义于头文件 <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,且 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("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);
}

可能的输出

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

[编辑] 参考

  • C23 标准 (ISO/IEC 9899:2024)
  • 7.12.6.4 frexp 函数 (p: TBD)
  • 7.25 类型通用数学 <tgmath.h> (p: TBD)
  • F.10.3.4 frexp 函数 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.6.4 frexp 函数 (p: TBD)
  • 7.25 类型通用数学 <tgmath.h> (p: TBD)
  • F.10.3.4 frexp 函数 (p: TBD)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.6.4 frexp 函数 (p: 243)
  • 7.25 类型通用数学 <tgmath.h> (p: 373-375)
  • F.10.3.4 frexp 函数 (p: 521)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.6.4 frexp 函数 (p: 224)
  • 7.22 类型通用数学 <tgmath.h> (p: 335-337)
  • F.9.3.4 frexp 函数 (p: 458)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.5.4.2 frexp 函数

[编辑] 参阅

将一个数字乘以2的幂
(函数) [编辑]
(C99)(C99)(C99)
提取给定数字的指数
(函数) [编辑]
(C99)(C99)(C99)
提取给定数字的指数
(函数) [编辑]
(C99)(C99)
将一个数字分解为整数部分和小数部分
(函数) [编辑]
C++ 文档frexp