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

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

説明

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);
}

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

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;
}

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

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;
}

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

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

コード解析

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

まとめ

frexp()この関数は浮動小数点数を仮数と指数に分解するために使用され、浮動小数点数演算を処理するための重要なツールです。適切に使用することでfrexp()、数値解析、科学計算、工学アプリケーションにおいて、浮動小数点数を効率的に操作できます。

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

その他の拡張