命名空间
变体
操作

frexp, frexpf, frexpl

来自 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)
浮点数操作
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) (since C99)
double      frexp( double arg, int* exp );
(2)
long double frexpl( long double arg, int* exp );
(3) (since C99)
定义于头文件 <tgmath.h>
#define frexp( arg, exp )
(4) (since C99)
1-3) 将给定的浮点数值 x 分解为归一化的小数和 2 的整数次幂。
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,则返回它,不修改,并在 *exp 中存储 0。
  • 如果 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 函数 (页码: 待定)
  • 7.25 类型泛型数学 <tgmath.h> (页码: 待定)
  • F.10.3.4 frexp 函数 (页码: 待定)
  • C17 标准 (ISO/IEC 9899:2018)
  • 7.12.6.4 frexp 函数 (页码: 待定)
  • 7.25 类型泛型数学 <tgmath.h> (页码: 待定)
  • F.10.3.4 frexp 函数 (页码: 待定)
  • C11 标准 (ISO/IEC 9899:2011)
  • 7.12.6.4 frexp 函数 (页码: 243)
  • 7.25 类型泛型数学 <tgmath.h> (页码: 373-375)
  • F.10.3.4 frexp 函数 (页码: 521)
  • C99 标准 (ISO/IEC 9899:1999)
  • 7.12.6.4 frexp 函数 (页码: 224)
  • 7.22 类型泛型数学 <tgmath.h> (页码: 335-337)
  • F.9.3.4 frexp 函数 (页码: 458)
  • C89/C90 标准 (ISO/IEC 9899:1990)
  • 4.5.4.2 frexp 函数

[编辑] 参见

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