C ライブラリ関数 -ldexp()
説明
C ライブラリ関数double ldexp(double x, int exponent)返すx2 のべき乗を掛けるexponentべき乗。
ldexp()C 標準ライブラリ<math.h>内の関数で、計算に使用されるx * 2^exp。これは通常、frexp()と組み合わせて使用することで、浮動小数点数の仮数部と指数部を再結合して1つの浮動小数点数にします。これは、数値計算や浮動小数点数の高度な操作において非常に役立ちます。
宣言
以下は ldexp() 関数の宣言です。
#include <math.h> double ldexp(double x, int exp); float ldexpf(float x, int exp); long double ldexpl(long double x, int exp);
引数
x:指数と結合する浮動小数点数。exp:2 を底とする指数。
戻り値
- 返す
x * 2^exp、型は入力されたxと一致する。
例
以下の例は、ldexp() 関数の使い方を示しています。
例
#include <math.h>
int main ()
{
double x, ret;
int n;
x = 0.65;
n = 3;
ret = ldexp(x ,n);
printf("%f * 2^%d = %f\n", x, n, ret);
return(0);
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます。
0.650000 * 2^3 = 5.200000
とfrexp()組み合わせて使用
以下の例は、次のことを示しています:frexp()とldexp()浮動小数点数を分解して再構築する方法:
例
#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()仮数と指数を元の浮動小数点数に再構築します。 - 元の値、仮数、指数、再構築された浮動小数点数を出力します。
エラー処理
ldexp()関数はエラー状態を返しませんが、特定の状況では、入力によりオーバーフローまたはアンダーフローが発生する可能性があります。大きすぎる結果または小さすぎる結果に対しては、正の無限大、負の無限大、またはゼロが返されることがあります。使用isinf()とisnan()関数を使用すると、これらの状況を検出できます。
以下の例は、オーバーフローとアンダーフローの可能性がある場合の処理方法を示しています。
例
#include <math.h>
#include <errno.h>
int main() {
double x = 1.0;
int exponent = 1024;
double result = ldexp(x, exponent);
if (isinf(result)) {
printf("Overflow: ldexp(%f, %d) results in infinity.\n", x, exponent);
} else if (result == 0.0 && errno == ERANGE) {
printf("Underflow: ldexp(%f, %d) results in zero.\n", x, exponent);
} else {
printf("ldexp(%f, %d) = %f\n", x, exponent, result);
}
return 0;
}
上記のプログラムをコンパイルして実行すると、次の結果が得られます。
Overflow: ldexp(1.000000, 1024) results in infinity.
コード解析
- 浮動小数点数を定義し
x、非常に大きな整数exponent。 - 呼び出して
ldexp(x, exponent)計算しx * 2^exponent、結果はresultに格納されます。 - 使用して
isinf()結果が無限大かどうかを確認し、オーバーフローを処理します。 - 結果がゼロかどうかを確認し、アンダーフローを処理します。
- 計算結果を出力します。
まとめ
ldexp()関数は計算に使用されx * 2^exp、浮動小数点演算を処理するための重要なツールです。適切に使用することでldexp()、数値解析、科学計算、および工学アプリケーションにおいて浮動小数点数の効率的な操作を実現でき、特に...とfrexp()関数を組み合わせて使用する場合。
C 標準ライブラリ - <math.h>