Cライブラリ関数 -frexp()
説明
Cライブラリ関数double frexp(double x, int *exponent)浮動小数点数 x を仮数と指数に分解します。戻り値は仮数であり、指数はexponentその中に格納されます。得られる値はx = mantissa * 2 ^ exponent。
frexp()C標準ライブラリの<math.h>中の関数であり、浮動小数点数を仮数(有効数)と2を底とする指数に分解するために使用されます。
宣言
以下は frexp() 関数の宣言です。
#include <math.h> double frexp(double x, int *exp); float frexpf(float x, int *exp); long double frexpl(long double x, int *exp);
引数
x:分解する浮動小数点数。exp:整数へのポインタで、2を底とする指数を格納するために使用されます。
戻り値
- 戻り値は
xの仮数部分であり、次の関係を満たします:x = mantissa * 2^expここでmantissa戻り値は、有効範囲が 0.5(含む)から 1.0(含まない)、または -0.5(含む)から -1.0(含まない)です。exp指数です。
例
以下の例は、frexp() 関数の使い方を示しています。
例
#include <stdio.h>
#include <math.h>
int main ()
{
double x = 1024, fraction;
int e;
fraction = frexp(x, &e);
printf("x = %.2lf = %.2lf * 2^%d\n", x, fraction, e);
return(0);
}
#include <math.h>
int main ()
{
double x = 1024, fraction;
int e;
fraction = frexp(x, &e);
printf("x = %.2lf = %.2lf * 2^%d\n", x, fraction, e);
return(0);
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます:
x = 1024.00 = 0.50 * 2^11
複数の浮動小数点数の処理
以下の例は、複数の浮動小数点数を処理する方法を示しています。
例
#include <stdio.h>
#include <math.h>
int main() {
double values[] = {0.5, 1.0, 4.0, 10.0, 16.0};
int num_values = sizeof(values) / sizeof(values[0]);
for (int i = 0; i < num_values; i++) {
double x = values[i];
int exponent;
double mantissa = frexp(x, &exponent);
printf("x = %f, mantissa = %f, exponent = %d\n", x, mantissa, exponent);
}
return 0;
}
#include <math.h>
int main() {
double values[] = {0.5, 1.0, 4.0, 10.0, 16.0};
int num_values = sizeof(values) / sizeof(values[0]);
for (int i = 0; i < num_values; i++) {
double x = values[i];
int exponent;
double mantissa = frexp(x, &exponent);
printf("x = %f, mantissa = %f, exponent = %d\n", x, mantissa, exponent);
}
return 0;
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます:
x = 0.500000, mantissa = 0.500000, exponent = 0 x = 1.000000, mantissa = 0.500000, exponent = 1 x = 4.000000, mantissa = 0.500000, exponent = 3 x = 10.000000, mantissa = 0.625000, exponent = 4 x = 16.000000, mantissa = 0.500000, exponent = 5
コード解析
- 複数の浮動小数点数を含む配列を定義します
values。 - 使用して
forループで各値を反復し、呼び出しますfrexp()分解して、結果を出力します。
使用frexp()の実際の応用
frexp()浮動小数点数の標準化表現や、数値解析におけるさまざまなアルゴリズムでよく使用されます。浮動小数点数を直接操作する際に発生するオーバーフローやアンダーフローの問題を回避するのに役立ちます。
以下の例は、使用方法を示していますfrexp()とldexp()(とfrexp()関連する関数)
例
#include <stdio.h>
#include <math.h>
int main() {
double x = 123.456;
int exponent;
double mantissa = frexp(x, &exponent);
// 浮動小数点数の再構築
double reconstructed_x = ldexp(mantissa, exponent);
printf("Original x = %f\n", x);
printf("Mantissa = %f, Exponent = %d\n", mantissa, exponent);
printf("Reconstructed x = %f\n", reconstructed_x);
return 0;
}
#include <math.h>
int main() {
double x = 123.456;
int exponent;
double mantissa = frexp(x, &exponent);
// 浮動小数点数の再構築
double reconstructed_x = ldexp(mantissa, exponent);
printf("Original x = %f\n", x);
printf("Mantissa = %f, Exponent = %d\n", mantissa, exponent);
printf("Reconstructed x = %f\n", reconstructed_x);
return 0;
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます:
Original x = 123.456000 Mantissa = 0.964500, Exponent = 7 Reconstructed x = 123.456000
コード解析
- 浮動小数点数を定義します
x、値は 123.456 です。 - 使用して
frexp()将x仮数と指数に分解します。 - 使用して
ldexp()仮数と指数を元の浮動小数点数に再構築します。 - 元の値、仮数、指数、再構築された浮動小数点数を出力します。
まとめ
frexp()この関数は浮動小数点数を仮数と指数に分解するために使用され、浮動小数点数演算を処理するための重要なツールです。適切に使用することでfrexp()、数値解析、科学計算、工学アプリケーションにおいて、浮動小数点数を効率的に操作できます。
C標準ライブラリ - <math.h>