名前空間
変種
操作

frexp, frexpf, frexpl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
(C99)
frexp
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <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) 指定された浮動小数点値 arg を正規化された小数部と整数の2の乗数に分解します。
4) 型総称マクロ。 arglong double 型の場合は frexpl が呼ばれます。 そうでなく、 arg が整数型または double 型の場合は frexp が呼ばれます。 そうでなければ frexpf が呼ばれます。

目次

[編集] 引数

arg - 浮動小数点値
exp - 指数を格納する整数値を指すポインタ

[編集] 戻り値

arg がゼロの場合は、ゼロを返し、 *exp にゼロを格納します。

そうでなく (arg がゼロでなく)、エラーが発生しなければ、 x×2(*exp)
=arg
であるような、範囲 (-1;-0.5], [0.5; 1) 内の値 x を返し、整数値を *exp に格納します。

*exp に格納される値が int の範囲外の場合、動作は未定義です。

arg が浮動小数点数でなければ、動作は未定義です。

[編集] エラー処理

この関数は math_errhandling で規定されているいかなるエラーの対象でもありません。

処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、

  • arg が ±0 であれば、それが変更されずに返され、 0*exp に格納されます。
  • arg が ±∞ であれば、それが返され、未規定の値が *exp に格納されます。
  • arg が NaN であれば、 NaN が返され、未規定の値が *exp に格納されます。
  • 浮動小数点例外は発生しません。
  • FLT_RADIX が 2 (または 2 の乗数) であれば、戻り値は正確であり、現在の丸めモードは無視されます。

[編集] ノート

2進数 (FLT_RADIX2) のシステムでは、 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 standard (ISO/IEC 9899:2011):
  • 7.12.6.4 The frexp functions (p: 243)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.3.4 The frexp functions (p: 521)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.6.4 The frexp functions (p: 224)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.3.4 The frexp functions (p: 458)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.5.4.2 The frexp function

[編集] 関連項目

数値に 2 の累乗を掛けます
(関数) [edit]
(C99)(C99)(C99)
指定された数値の指数を取り出します
(関数) [edit]
(C99)(C99)(C99)
指定された数値の指数を取り出します
(関数) [edit]
(C99)(C99)
数値を整数部と小数部に分解します
(関数) [edit]