# std::frexp, std::frexpf, std::frexpl

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
| (1) |
float frexp ( float arg, int* exp ); |  |
float frexpf( float arg, int* exp ); |  | (C++11 起)
double frexp ( double arg, int* exp ); | (2) |
| (3) |
long double frexp ( long double arg, int* exp ); |  |
long double frexpl( long double arg, int* exp ); |  | (C++11 起)
double frexp ( IntegralType arg, int* exp ); | (4) | (C++11 起)

1-3) 分解给定的浮点值 `x` 为正规化小数和二的整数幂。
4) 接受任何整数类型参数的重载集或函数模板。等价于 (2) （将参数转型为 double ）。

### 参数

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 + std::logb(value));
        return std::scalbn(value, -(*exp));
    }

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

### 示例

比较不同的浮点分解函数

    #include <iostream>
    #include <cmath>
    #include <limits>

    int main()
    {
        double f = 123.45;
        std::cout << "Given the number " << f << " or " << std::hexfloat
                  << f << std::defaultfloat << " in hex,\n";

        double f3;
        double f2 = std::modf(f, &f3);
        std::cout << "modf() makes " << f3 << " + " << f2 << '\n';

        int i;
        f2 = std::frexp(f, &i);
        std::cout << "frexp() makes " << f2 << " * 2^" << i << '\n';

        i = std::ilogb(f);
        std::cout << "logb()/ilogb() make " << f/std::scalbn(1.0, i) << " * "
                  << std::numeric_limits<double>::radix
                  << "^" << std::ilogb(f) << '\n';
    }

可能的输出：

    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

### 参阅

ldexp ldexpf ldexpl (C++11)(C++11) | 将数乘以 2 的幂次 (函数)
logb logbf logbl (C++11)(C++11)(C++11) | 提取数的指数 (函数)
ilogb ilogbf ilogbl (C++11)(C++11)(C++11) | 提取数的指数 (函数)
modf modff modfl (C++11)(C++11) | 分解数为整数和小数部分 (函数)