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 $