frexp関数は、浮動小数点実数を仮数部(小数成分)と指数部(整数成分)に変換した値を求めます。この関数は、ldexp関数の逆関数です。

#include <math.h>
double frexp(double x, int *exp);

xは変換する値を指定します。
*expは指数部を格納する変数のアドレスを指定します。

戻り値として、仮数部の値を返します。

frexp関数は正規化小数を返します。引数xが0でない場合、この正規化小数はxに2の累乗を乗じたもので、その絶対値は常に0.5 以上1.0未満の値です。xが0の場合、正規化小数は0になり*expには0が格納されます。

プログラム 例

#include <stdio.h>
#include <math.h>

int main(void)
{
  int    loop_cnt;
  int    exp;
  double x;
  double ind;

  for (loop_cnt = 1; loop_cnt <= 5; ++loop_cnt) {
    printf('実数を入力してください ==> ');
    scanf('%lf', &x);

    ind = frexp(x, &exp);
    printf('%fの仮数部は%f、指数部は%d\n', x, ind, exp);
  }

  return 0;
}

例の実行結果

$ ./frexp.exe
実数を入力してください ==> 1
1.000000の仮数部は0.500000、指数部は1
実数を入力してください ==> -1
-1.000000の仮数部は-0.500000、指数部は1
実数を入力してください ==> 256
256.000000の仮数部は0.500000、指数部は9
実数を入力してください ==> 1024
1024.000000の仮数部は0.500000、指数部は11
実数を入力してください ==> 0.5
0.500000の仮数部は0.500000、指数部は0
$