非常教程

C参考手册

数值 | Numerics

frexpl

在头文件<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,则返回,未修改,0存储在* exp中。
  • 如果arg为±∞,则返回该值,并将未指定的值存储在* exp中。
  • 如果arg是NaN,则返回NaN,并将未指定的值存储在* exp中。
  • 没有引发浮点异常。
  • 如果FLT_RADIX是2(或2的幂),则返回的值是精确的,当前舍入模式将被忽略

注意

在二进制系统上(其中FLT_RADIX是2),frexp可以实现为:

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

函数frexp及其双重ldexp可用于操纵浮点数的表示,而无需直接位操作。

#include <stdio.h>
#include <math.h>
#include <float.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

参考

  • 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函数

扩展内容

ldexpldexpfldexpl(C99)(C99)

将一个数字乘以2来提高权力(功能)

logblogbflogbl(C99)(C99)(C99)

提取给定数字的指数(函数)

ilogbilogbfilogbl(C99)(C99)(C99)

提取给定数字的指数(函数)

modfmodffmodfl(C99)(C99)

将数字分成整数和小数部分(函数)

| 用于frexp的C ++文档 |

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。