命名空间
变体
操作

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 分解为归一化分数和 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 函数 (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++ 文档 for frexp