この関数の目的
frexp()は、浮動小数点数を指数部と仮数部に分ける。
定義
#include <math.h> double frexp(double value, int *exponent);
働き
value で渡された浮動小数点数を正規化された分数と2の整数のべき乗に分ける。 整数を exponent で指された int 型のオブジェクトに代入する。
返り値は、1/2以上1未満か0で、value == x * exp(2, *exponent)
を満たすxの値を持つ。
value が 0 の場合、返り値も *exponent
も 0 となる。
解説
定義はわけがわからないが、この関数がすることは、要するにdoubleを指数部と仮数部に分けることである。
コンピュータが実数を記憶するのに使う浮動小数点数とは、人間が使う指数( 1.2×105 のような表現)と同じで、
指数部と仮数部に分けて記憶するというものであるから、それを知る関数が欲しいわけである。
コンピュータでは指数部の底は 2 なので、 2 の指数を返すわけである。
コンピュータの内部では、 [仮数部]×2[指数部] という形で、 仮数部が正規化されて記憶されているはずである 注 が、
実装方法は決められていないので規格には分かりやすく書けなかったのであろう。
目的がわかったところで、使い方の説明をしよう。
まず、 value は指数部や仮数部を知りたい変数である。
次に、 exponent は指数部の値を格納する変数へのポインタである。
これが正しい変数を指していない場合(NULLなど)の動作は未定義である。
最後に、返り値は仮数部となるが、この値が1/2以上1未満であるのは、1/2未満になると指数部が一つ落ちるからに他ならない。