C ライブラリ関数 -ldexp()

C 标准库 - <math.h>C 標準ライブラリ - <math.h>

説明

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 <stdio.h>
#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 <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;
}

上記のプログラムをコンパイルして実行すると、次の結果が得られます。

Original x = 123.456000
Mantissa = 0.964500, Exponent = 7
Reconstructed x = 123.456000

コード解析

  • 浮動小数点数を定義しますx、値は 123.456 です。
  • 使用してfrexp() 将 x仮数と指数に分解します。
  • 使用してldexp()仮数と指数を元の浮動小数点数に再構築します。
  • 元の値、仮数、指数、再構築された浮動小数点数を出力します。

エラー処理

ldexp()関数はエラー状態を返しませんが、特定の状況では、入力によりオーバーフローまたはアンダーフローが発生する可能性があります。大きすぎる結果または小さすぎる結果に対しては、正の無限大、負の無限大、またはゼロが返されることがあります。使用isinf()とisnan()関数を使用すると、これらの状況を検出できます。

以下の例は、オーバーフローとアンダーフローの可能性がある場合の処理方法を示しています。

例

#include <stdio.h>
#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>C 標準ライブラリ - <math.h>

その他の拡張