arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
frexp()
frexp()

この関数の目的

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未満になると指数部が一つ落ちるからに他ならない。


(注) - 実際には有効桁、表現可能域などいくつかの特徴が最適な記憶方法がそれぞれ存在する。 IBM 方式と呼ばれるものは、有効桁数が落ちる可能性があるが、表現可能な値の範囲は広い。 また、 IEEE 方式は表現可能な値の範囲では IBM 方式にはかなわないが、有効桁数が( 2 進で)一定であるという利点がある。 詳しくはワンポイントTipsの 浮動小数点数の内部表現 を参照されたい。
実際にどの方式が使われるかは、コンピュータのハードウェアに依存するため、可搬性のある言語では厳密に定義することができない。
arrow 若葉プログラミング塾 > 知識の玉手箱 > C関数リファレンス >
KC