Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
frexp
(C++11) (C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
定义于头文件 <cmath>
(1)
float frexp ( float num, int * exp ) ;

double frexp ( double num, int * exp ) ;

long double frexp ( long double num, int * exp ) ;
(C++23 前)
constexpr /* floating-point-type */
frexp ( /* floating-point-type */ num, int * exp ) ;
(C++23 起)
float frexpf ( float num, int * exp ) ;
(2) (C++11 起)
(C++23 起为 constexpr)
long double frexpl ( long double num, int * exp ) ;
(3) (C++11 起)
(C++23 起为 constexpr)
额外重载 (C++11 起)
定义于头文件 <cmath>
template < class Integer >
double frexp ( Integer num, int * exp ) ;
(A) (C++23 起为 constexpr)
1-3) 将给定的浮点值 num 分解为规范化小数和二的整数次幂。 标准库为所有 cv 未限定浮点类型提供了 std::frexp 的重载,作为参数 num 的类型。 (C++23 起)
A) 为所有整数类型提供了额外的重载,这些类型被视为 double
(since C++11)

目录

参数

num - 浮点数或整数值
exp - 指向存储指数的整数值的指针

返回值

如果 num 为零,则返回零并在 * exp 中存储零值。

否则(若 num 不为零),且未发生错误时,返回范围 (-1, -0.5], [0.5, 1) 内的值 x ,并在 * exp 中存储整数值,使得 x×2 (*exp)
== num

如果要存储在 * exp 中的值超出 int 的范围,则行为未定义。

错误处理

此函数不受 math_errhandling 中指定的任何错误影响。

如果实现支持 IEEE 浮点算术 (IEC 60559),

  • 如果 num 为 ±0,则直接返回该值,并在 * exp 中存储 0
  • 如果 num 为 ±∞,则直接返回该值,并在 * exp 中存储未指定的值。
  • 如果 num 为 NaN,则返回 NaN,并在 * exp 中存储未指定的值。
  • 不会触发任何浮点异常。
  • FLT_RADIX 为 2(或 2 的幂次),返回值是精确的,且忽略 当前舍入模式

注释

在二进制系统(其中 FLT_RADIX 2 )中, std::frexp 可通过以下方式实现:

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

函数 std::frexp 与其对应函数 std::ldexp 可用于在不直接进行位操作的情况下操控浮点数的表示形式。

额外的重载并不需要完全按照 (A) 的形式提供。它们只需确保对于整数类型的实参 num std :: frexp ( num, exp ) 能够产生与 std :: frexp ( static_cast < double > ( num ) , exp ) 相同的效果。

示例

比较不同的浮点数分解函数:

#include <cmath>
#include <iostream>
#include <limits>
int main()
{
    double f = 123.45;
    std::cout << "给定数值 " << f << " 或十六进制格式 " << std::hexfloat
              << f << std::defaultfloat << ",\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() 分解为 " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() 分解为 " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() 分解为 " << f / std::scalbn(1.0, i)
              << " * " << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
}

可能的输出:

给定数值 123.45 或十六进制格式 0x1.edccccccccccdp+6,
modf() 分解为 123 + 0.45
frexp() 分解为 0.964453 * 2^7
logb()/ilogb() 分解为 1.92891 * 2^6

参见

(C++11) (C++11)
将数字乘以2的整数次幂
(函数)
(C++11) (C++11) (C++11)
提取数字的指数
(函数)
(C++11) (C++11) (C++11)
提取数字的指数
(函数)
(C++11) (C++11)
将数字分解为整数和小数部分
(函数)