std:: frexp, std:: frexpf, std:: frexpl
|
定義済みヘッダー
<cmath>
|
||
| (1) | ||
|
float
frexp
(
float
num,
int
*
exp
)
;
double
frexp
(
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) |
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)
|
数値を整数部と小数部に分解する
(関数) |
|
Cドキュメント
for
frexp
|
|