【C言語】数学を超えた世界へ!複素数プログラミング入門:CMPLXFマクロ編

2024-06-16

C言語における "CMPLXF" のプログラミング解説

float complex 型 は、実数部と虚数部を持つ複素数を表すデータ型です。実数部は float 型、虚数部は float 型で表現されます。

CMPLXF マクロ は、以下の引数を取ります。

  • real: 複素数の実数部
(float complex)((float)(real) + _Imaginary_I * (float)(imag))

_Imaginary_I は、C言語における虚数単位 i を表すマクロです。

CMPLXF マクロ の例

#include <complex.h>

int main() {
  float complex z = CMPLXF(1.0, 2.0);
  printf("z = %.1f%+.1fi\n", creal(z), cimag(z));
  return 0;
}

このコードは、実数部が 1.0、虚数部が 2.0 の複素数 z を初期化し、その実数部と虚数部を出力します。

  • 複素数の初期化を簡潔に記述できる
  • 型変換を明示的に記述する必要がない
  • float complex 型は、実数部と虚数部が float 型である複素数を表す型である

CMPLXF マクロ は、C言語で複素数を扱う際に便利なツールです。上記の説明を参考に、ぜひ活用してみてください。

補足

  • double complex 型と long double complex 型の複素数を初期化するには、それぞれ CMPLX マクロと CMPLXL マクロを使用します。
  • C++ 言語では、std::complex テンプレートを使用して複素数を扱うことができます。


    CMPLXF マクロを使用したサンプルコード

    複素数の加減乗除

    #include <complex.h>
    
    int main() {
      float complex z1 = CMPLXF(1.0, 2.0);
      float complex z2 = CMPLXF(3.0, 4.0);
    
      float complex sum = z1 + z2;
      float complex difference = z1 - z2;
      float complex product = z1 * z2;
      float complex quotient = z1 / z2;
    
      printf("和: %.1f%+.1fi\n", creal(sum), cimag(sum));
      printf("差: %.1f%+.1fi\n", creal(difference), cimag(difference));
      printf("積: %.1f%+.1fi\n", creal(product), cimag(product));
      printf("商: %.1f%+.1fi\n", creal(quotient), cimag(quotient));
    
      return 0;
    }
    

    このコードは、以下の複素数の演算を行います。

    • 加算: z1 + z2

    複素数の絶対値と偏角

    #include <complex.h>
    
    int main() {
      float complex z = CMPLXF(3.0, 4.0);
    
      float abs = cabsl(z);
      float angle = carg(z);
    
      printf("絶対値: %.1f\n", abs);
      printf("偏角: %.1f度\n", angle * 180.0 / M_PI);
    
      return 0;
    }
    
    • 絶対値: cabsl(z)
    • 偏角: carg(z)

    複素指数関数と対数関数

    #include <complex.h>
    
    int main() {
      float complex z = CMPLXF(1.0, 2.0);
    
      float complex expz = cexp(z);
      float complex logz = clog(z);
    
      printf("e^(z): %.1f%+.1fi\n", creal(expz), cimag(expz));
      printf("ln(z): %.1f%+.1fi\n", creal(logz), cimag(logz));
    
      return 0;
    }
    
    • 複素指数関数: cexp(z)

    複素共役

    #include <complex.h>
    
    int main() {
      float complex z = CMPLXF(1.0, 2.0);
    
      float complex conjz = conj(z);
    
      printf("複素共役: %.1f%+.1fi\n", creal(conjz), cimag(conjz));
    
      return 0;
    }
    
    • 複素共役: conj(z)

    これらのサンプルコードは、CMPLXF マクロ を使って複素数を扱う基本的な方法を示しています。

    • 上記のコードは、float complex 型の複素数を扱っています。double complex 型や long double complex 型の複素数を扱う場合は、型名を変える必要があります。
    • C言語には、複素数を扱うための標準ライブラリ <complex.h> が用意されています。このライブラリには、上記のサンプルコードで紹介した関数以外にも、様々な関数が用意されています。
    • 複素数については、数学的な知識が必要となります。複素数の演算について詳しく理解するには、数学の教科書や参考書を参照することをお勧めします。


    "CMPLXF" の代替方法

    直接代入

    最も基本的な方法は、実数部と虚数部を直接代入する方法です。

    float complex z = 1.0 + 2.0 * _Imaginary_I;
    

    complex 構造体を使用する

    C言語の標準ヘッダー <complex.h> には、complex 構造体が定義されています。この構造体を使用して、複素数を初期化することができます。

    complex z = {1.0, 2.0};
    

    make_complex 関数を使用する

    complex z = make_complex(1.0, 2.0);
    

    C++ の std::complex テンプレートを使用する (C++ の場合)

    #include <complex>
    
    std::complex<float> z = 1.0 + 2.0i;
    

    各方法の比較

    方法利点欠点
    CMPLXF マクロ簡潔に記述できる型変換を明示的に記述する必要がない
    直接代入最も基本的な方法可読性が低い
    complex 構造体可読性が高いC++ では使用できない
    make_complex 関数可読性が高い、C++ でも使用できる関数呼び出しが必要
    std::complex テンプレート (C++ のみ)型推論が可能、可読性が高いC言語では使用できない
    • 簡潔に記述したい場合は、CMPLXF マクロ を使用するのが良いでしょう。
    • 可読性を重視したい場合は、直接代入、complex 構造体、または make_complex 関数を使用するのが良いでしょう。
    • C++ で複素数を扱う場合は、std::complex テンプレートを使用するのが良いでしょう。