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)
定義済みヘッダー <cmath>
template < class Integer >
double frexp ( Integer num, int * exp ) ;
(A) (C++23からconstexpr)
1-3) 与えられた浮動小数点値 num を正規化された仮数部と2の整数乗の指数に分解する。 ライブラリは、パラメータ num の型として、すべてのcv修飾されていない浮動小数点型に対する std::frexp のオーバーロードを提供する。 (C++23以降)
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。
(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の場合、変更されずに返され、 0 * exp に格納される。
  • 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 << "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

関連項目

(C++11) (C++11)
数値に2の整数乗を乗算する
(関数)
(C++11) (C++11) (C++11)
数値の指数部を抽出する
(関数)
(C++11) (C++11) (C++11)
数値の指数部を抽出する
(関数)
(C++11) (C++11)
数値を整数部と小数部に分解する
(関数)