C言語における複素数の利用方法

C89 の複素数

C89(ANSI C)等の古い標準Cでは, 複素数用のデータ型や関数を各プログラマが独自に実装していた.

複素数型の定義例:

#include <math.h>

// 複素数のデータ型
typedef struct { double	re, im; } Complex;

// 直交座標形式の数値設定関数
//	数学:z = x + i y	コード:z = cValue(x, y);
Complex cValue(double x, double y)
{
	Complex	z;
	z.re = x;
	z.im = y;
	return (z);
}

// 極座標形式の数値設定関数
//	数学:z = r exp(j a)	コード:z = cPolar(r, a);
Complex cPolar(double r, double a)
{
	return (cValue(r*cos(a), r*sin(a)));
}

// 加算関数
//	数学:c = a + b		コード:c = cAdd(a, b);
Complex cAdd(Complex a, Complex b)
{
	return (cValue(a.re + b.re, a.im + b.im));
}
...
C99 の複素数

組込機能

C99 標準(や GCC)では,実数の拡張版として,複素数を取り扱えるようになった. もちろん,複素数同士の四則演算や変数への代入も可能である.

使用例:

名称コード書式コード例補足
複素数型double _Complex double _Complex z;複素変数 z の宣言
虚数接尾辞i z = 1.0 + 2.0i;変数 z への複素数 \( 1 + i 2 \) の代入

型名にアンダーバーが付けられているのは, 古い独自実装との互換性確保(名前衝突回避)のための配慮でしょう.
これで,複素数の独自実装は不要となった. ただし,さらに新しい C11 標準では,必須機能から外れてしまったので, 独自実装が再度必要な環境もあり得る. 互換性や規模感などの問題で揉めたのでしょう.

標準ライブラリ

複素数用の数学関数等も標準ライブラリとして提供されるようになった.

参考文献

C99 の魅惑の機能

C99 では,複素数の他にも便利(かつ危険)な機能が提供されている.

C99 複素数のカスタマイズ

工学分野では,虚数単位の記号として \( i \) とか I ではなく \( j \) とか J を使いたい. また,複素数利用時には,しばしば,円周率πも使いたい. そして,型名の double complex は長すぎる...


(c) 2023, yanagawa@kushiro-ct.ac.jp