C言語/標準ライブラリ/complex.h
ヘッダー <complex.h>
には、複素数演算をサポートするマクロと関数が定義されています[1]。
各シノプシスは、1つ以上の complex
型の引数と complex
または double
の返値を持つ主関数からなる関数ファミリーを指定します。
同じ名前で接尾辞がfとlの他の関数は、float
と long double
の引数と返値を持つ対応する関数です[2]。
規約
[編集]値は、度ではなくラジアンとして解釈されます[3]。 実装では errno を設定することができますが必須ではありません[3]。
分岐点
[編集]以下の関数の中には、関数が不連続になる分岐点(branch cuts)がある[4]。
符号付きゼロを持つ実装(すべてのIEC 60559の実装を含む)で、Annex Gの仕様に従っている場合、ゼロの符号は切り口の片側ともう片側を区別するので、切り口がどちらかの側から近づくと関数は(フォーマットの制限を除いて)連続的になります。例えば、負の実軸に沿って枝分かれしたカットを持つ平方根関数の場合、虚数部+0のカットの上部は正の虚数軸に対応し、虚数部-0のカットの下部は負の虚数軸に対応する[4]。
符号付きゼロをサポートしていない実装(附属書F参照)では、分岐カットの側面を区別できません。 枝分かれしたカットの側面を区別できない。これらの実装では、関数が連続的になるようにカットをマッピングする。 関数が連続的になるように切り口を写す。 時計回りの方向に接近するようにカットをマッピングする。(ここで指定されている関数のブランチカットは、1つの有限の 終点は1つだけです)。 例えば、平方根関数の場合、負の実軸に沿ったカットの有限終点を反時計回りに回ってくると、負の実軸に沿った切り口の有限の終点が上から切り口に近づく。となり、切り口は正の虚数軸に写ります。
CX_LIMITED_RANGEプラグマ
[編集]#include <complex.h> #pragma STDC CX_LIMITED_RANGE on-off-switch
複素数の乗算、除算、絶対値を表す通常の数式は、無限大を扱う点で問題があります[5]。 無限大の扱いや、過度のオーバーフローやアンダーフローが問題となります。
CX_LIMITED_RANGEプラグマは、(状態がonの場合)通常の数式が許容されることを実装に知らせるために使用できます。
このプラグマは、外部宣言の外側でも、複合文の中のすべての明示的な宣言や文の前でも使用できます。外部宣言の外側にある場合、プラグマはその発生から他のCX_LIMITED_RANGEプラグマに遭遇するまで、または翻訳単位が終了するまで効力を発揮します。
複合文の内部では、プラグマはその発生時から別のCX_LIMITED_RANGEプラグマに遭遇するまで、または翻訳単位が終了するまで有効です。 別のCX_LIMITED_RANGEプラグマが発生するまで(入れ子になった複合文の中も含む)、または複合文が終了するまで。複合文の終了時には、プラグマの状態は複合文の直前の状態に戻ります。複合文の終了時には、プラグマの状態は複合文の直前の状態に戻ります。このプラグマが他の文脈で使用された場合、その動作は 未定義となります。このプラグマのデフォルトの状態はoffです。
マクロ
[編集]<complex.h>
では、以下のマクロが定義されます[2]。
- complex
- キーワード_Complexのエイリアス。
- _Complex_I
- "const float _Complex "という型を持ち、虚数単位Iの値、I * I = -1 を持つ定数。
- C99 Annex Gと互換性のあるコンパイラモードでのみ定義されています[6]。
- imaginary
- キーワード_Imaginaryのエイリアス
- _Imaginary_I
- 虚数単位の値を持つ const float _Imaginary 型の定数式に展開します。
- I
- _Imaginary_I が定義されているれば _Imaginary_I の、定義されていなければ _Complex_I のエイリアス。
complex
、imaginary
、I
のマクロが内部の値と干渉する場合、アプリケーションはその定義を解除することができます。
例えば、電気工学分野では I は電流を示し多用されるため虚数単位には j が用いられる(など)。
- コード例
#undef I #define j _Imaginary_I
関数
[編集]複素数三角関数
[編集]ISO/IEC 9899:2017 § 7.3.5 Trigonometric functions
cacos関数群
[編集]ISO/IEC 9899:2017 § 7.3.5.1 The cacos functions[7]。
- 形式
#include <complex.h> double complex cacos(double complex z); float complex cacosf(float complex z); long double complex cacosl(long double complex z);
- 説明
- cacos関数は、複素 acos を実軸の区間[-1, +1]の外側で分岐して計算します。実軸に沿った区間[-1, +1]の外側で分岐します。
- 返値
- cacos関数は、複素 acos 値を複素数で返します。数学的に拘束されないストリップの範囲で、実軸に沿った区間 [0, π ]の複素 acos 値を返します。
casin関数群
[編集]ISO/IEC 9899:2017 § 7.3.5.2 The casin functions[8]。
- 形式
#include <complex.h> double complex casin(double complex z); float complex casinf(float complex z); long double complex casinl(long double complex z);
- 説明
- casin関数は、zの複素逆正弦を、実軸に沿った区間[-1, +1]の外側で分岐して計算します。
- 返値
- casin関数は、複素逆正弦の値を複素数で返します。この値は、虚軸方向には数学的に束縛されない範囲で、実軸方向には区間[-π /2, +π /2]の範囲です。
catan関数群
[編集]ISO/IEC 9899:2017 § 7.3.5.3 The catan functions[9]。
- 形式
#include <complex.h> double complex catan(double complex z); float complex catanf(float complex z); long double complex catanl(long double complex z);
- 説明
- catan関数は、zの複素逆正接を計算し、虚軸に沿って区間[-i, +i]の外側で分岐します。
- 返値
- catan関数は、複素逆正接を複素数で返します。その範囲は、虚軸に沿った数学的に束縛されていないストリップの範囲で、実軸に沿った区間[-π /2, +π /2]です。
ccos関数群
[編集]ISO/IEC 9899:2017 § 7.3.5.4 The ccos functions[10]。
- 形式
#include <complex.h> double complex ccos(double complex z); float complex ccosf(float complex z); long double complex ccosl(long double complex z);
- 説明
- ccos関数は、zの複素余弦を計算します。
- 返値
- ccos関数は、複素余弦の値を複素数で返します。
csin関数群
[編集]ISO/IEC 9899:2017 § 7.3.5.5 The csin functions[11]。;形式 :
#include <complex.h>
double complex csin(double complex z);
float complex csinf(float complex z);
long double complex csinl(long double complex z);
- 説明
- csin関数は、zの複素正弦を計算します。
- 返値
- csin関数は、複素正弦の値を複素数で返します。
ctan関数群
[編集]ISO/IEC 9899:2017 § 7.3.5.6 The ctan functions[12]。
- 形式
#include <complex.h> double complex ctan(double complex z); float complex ctanf(float complex z); long double complex ctanl(long double complex z);
- 説明
- ctan関数は、zの複素正接を計算します。
- 返値
- ctan関数は、複素正弦の値を複素数で返します。
複素数双曲線関数
[編集]ISO/IEC 9899:2017 § 7.3.6 Hyperbolic functions
cacosh関数群
[編集]ISO/IEC 9899:2017 § 7.3.6.1 The cacosh functions[13]。
- 形式
#include <complex.h> double complex cacosh(double complex z); float complex cacoshf(float complex z); long double complex cacoshl(long double complex z);
- 説明
- cacosh関数は、zの複素数逆双曲線余弦を、実軸に沿って1未満の値で分岐して計算します。
- 返値
- cacosh関数は,複素数逆双曲線余弦の値を返します.実軸は非負の値の半ストリップ,虚軸は区間 [-iπ , +iπ] の範囲です.
casinh関数群
[編集]ISO/IEC 9899:2017 § 7.3.6.2 The casinh functions[14]。
- 形式
#include <complex.h> double complex casinh(double complex z); float complex casinhf(float complex z); long double complex casinhl(long double complex z);
- 説明
- casinh関数は,zの複素数逆双曲線正弦を,虚軸に沿って区間[-i, +i]の外側で分岐して計算します。
- 返値
- casinh 関数は,複素数逆双曲線正弦の値を,実軸では数学的に束縛されない帯の範囲,虚軸では区間 [-iπ /2, +iπ /2] の範囲で返します。
catanh関数群
[編集]ISO/IEC 9899:2017 § 7.3.6.3 The catanh functions[15]。
- 形式
#include <complex.h> double complex catanh(double complex z); float complex catanhf(float complex z); long double complex catanhl(long double complex z);
- 説明
- catanh関数は、zの複素数逆双曲線正接を、実軸に沿った区間[-1, +1]の外側で分岐して計算します。
- 返値
- catanh関数は、複素数逆双曲線正接の値を、実軸は数学的に束縛されていない帯の範囲で、虚軸は区間[-iπ /2, +iπ /2]で返します。
ccosh関数群
[編集]ISO/IEC 9899:2017 § 7.3.6.4 The ccosh functions[16]。
- 形式
#include <complex.h> double complex ccosh(double complex z); float complex ccoshf(float complex z); long double complex ccoshl(long double complex z);
- 説明
- ccosh関数は、zの複素数逆双曲線余弦を計算します。
- 返値
- ccosh関数は、複素数逆双曲線余弦の値を返します。
csinh関数群
[編集]ISO/IEC 9899:2017 § 7.3.6.5 The csinh functions[17]。
- 形式
#include <complex.h> double complex csinh(double complex z); float complex csinhf(float complex z); long double complex csinhl(long double complex z);
- 説明
- csinh関数は、zの複素数双曲線正弦を計算します。
- 返値
- csinh関数は、複素数双曲線正弦の値を返します。
ctanh関数群
[編集]ISO/IEC 9899:2017 § 7.3.6.6 The ctanh functions[18]。
- 形式
#include <complex.h> double complex ctanh(double complex z); float complex ctanhf(float complex z); long double complex ctanhl(long double complex z);
- 説明
- ctanh関数は、zの複素数双曲線正接を計算します。
- 返値
- ctanh関数は、複素数双曲線正接の値を返します。
複素数指数関数及び複素数対数関数
[編集]ISO/IEC 9899:2017 § 7.3.7 Exponential and logarithmic functions
cexp関数群
[編集]ISO/IEC 9899:2017 § 7.3.7.1 The cexp functions[19]。
- 形式
#include <complex.h> double complex cexp(double complex z); float complex cexpf(float complex z); long double complex cexpl(long double complex z);
- 機能
- cexp関数群は、z の e を底とする複素指数関数を計算します。
- 返却値
- cexp関数群は、z の e を底とする複素指数関数を返します。
clog関数群
[編集]ISO/IEC 9899:2017 § 7.3.7.2 The clog functions[20]。
- 形式
#include <complex.h> double complex clog(double complex z); float complex clogf(float complex z); long double complex clogl(long double complex z);
- 機能
- clog関数群は、負の実軸に沿って分岐線法を使用して、z の複素自然対数 (e を底とする) を計算します。
- 返却値
:clog関数群は、複素自然対数の値を返します。この値は、実軸では数学的に束縛されていないストリップの範囲であり、虚軸では区間[-iπ, +iπ]の範囲です。
複素数べき乗関数及び複素数絶対値関数
[編集]ISO/IEC 9899:2017 § 7.3.8 Power and absolute-value functions
cabs関数群
[編集]ISO/IEC 9899:2017 § 7.3.8.1 The cabs[21] functions[22]。
- 形式
#include <complex.h> double cabs(double complex z); float cabsf(float complex z); long double cabsl(long double complex z);
- 機能
- cabs関数群は、zの複素絶対値(ノルム(norm)、モジュラス(modulus)、マグニチュード(magnitude)とも呼ばれる)を計算します
of z.
- 返却値
- cabs関数群は、複素数の絶対値を返します。
cpow関数群
[編集]ISO/IEC 9899:2017 § 7.3.8.2 The cpow functions[23]。
- 形式
#include <complex.h> double complex cpow(double complex x, double complex y); float complex cpowf(float complex x, float complex y); long double complex cpowl(long double complex x,long double complex y);
- 機能
- cpow関数群は、複素数のべき乗関数xyを計算し、負の実軸に沿って第1パラメータの分岐を行います。
- 返却値
- cpow関数群は、複素数のべき乗関数の値を返します。
csqrt関数群
[編集]ISO/IEC 9899:2017 § 7.3.8.3 The csqrt functions[24]。
- 形式
#include <complex.h> double complex csqrt(double complex z); float complex csqrtf(float complex z); long double complex csqrtl(long double complex z);
- 機能
- 2 The csqrt functions compute the complex square root of z, with a branch cut along the negative
real axis.
- 返却値
- 3 The csqrt functions return the complex square root value, in the range of the right half-plane
(including the imaginary axis).
複素数操作
[編集]
carg関数群
[編集]複素数の偏角を計算する ISO/IEC 9899:2017 § 7.3.9.1 The carg functions[25]。
- 形式
#include <complex.h> double carg(double complex z); float cargf(float complex z); long double cargl(long double complex z);
cimag関数群
[編集]複素数の虚数部を返します。 ISO/IEC 9899:2017 § 7.3.9.2 The cimag functions[26]。
- 形式
#include <complex.h> double cimag(double complex z); float cimagf(float complex z); long double cimagl(long double complex z);
CMPLXマクロ群
[編集]CMPLXマクロ群は、指定された複素数型の式に展開され、実数部はxの(変換後の)値、虚数部はyの(変換後の)値となります[27]。 結果として得られる式は、両方の引数が同様に適切である場合に、静的またはスレッドストレージ期間を持つオブジェクトのイニシャライザーとして使用するのに適しているものとします。
ISO/IEC 9899:2017 § 7.3.9.3 The CMPLX macros[28]。; 形式:
#include <complex.h>
double complex CMPLX(double x, double y);
float complex CMPLXF(float x, float y);
long double complex CMPLXL(long double x, long double y);
- 戻値
- x + iy
- 歴史
- CMPLXマクロ群は、C11で追加されました。
これらのマクロは、あたかも実装が虚数型をサポートしているかのように動作し定義は、
#define CMPLX(x, y) ((double complex)((double)(x) + \ _Imaginary_I * (double)(y))) #define CMPLXF(x, y) ((float complex)((float)(x) + \ _Imaginary_I * (float)(y))) #define CMPLXL(x, y) ((long double complex)((long double)(x) + \ _Imaginary_I * (long double)(y)))
のようなものになります。
conj関数群
[編集]複素共役を計算します。 ISO/IEC 9899:2017 § 7.3.9.4 The conj functions[29]。
- 形式
#include <complex.h> double complex conj(double complex z); float complex conjf(float complex z); long double complex conjl(long double complex z);
cproj関数群
[編集]リーマン球面への複素数の投影を計算します。
ISO/IEC 9899:2017 § 7.3.9.5 The cproj functions[30]。; 形式:
#include <complex.h>
double complex cproj(double complex z);
float complex cprojf(float complex z);
long double complex cprojl(long double complex z);
creal関数群
[編集]複素数の実数部を返します。 ISO/IEC 9899:2017 § 7.3.9.6 The creal functions[31]。
- 形式
#include <complex.h> double creal(double complex z); float crealf(float complex z); long double creall(long double complex z);
関連項目
[編集]脚註
[編集]- ^ WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3. ISO/IEC. p. 170, §7.3 Complex arithmetic .
- ^ 2.0 2.1 WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3. ISO/IEC. p. 170, §7.3.1 Introduction .
- ^ 3.0 3.1 WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3. ISO/IEC. p. 170, §7.3.2 Conventions .
- ^ 4.0 4.1 WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3. ISO/IEC. p. 171, §7.3.3 Branch cuts .
- ^ WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3. ISO/IEC. p. 171, §7.3.4 The CX_LIMITED_RANGE pragma .
- ^ C99: WG14/N1256 Committee Draft — Septermber 7、 2007. ISO/IEC. p. 466、Annex G (informative) IEC 60559-compatible complex arithmetic .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 137, §7.3.5.1 The cacos functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 138, §7.3.5.2 The casin functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 138, §7.3.5.3 The catan functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 138, §7.3.5.4 The ccos functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 138, §7.3.5.5 The csin functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 139, §7.3.5.6 The ctan functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 139, §7.3.6.1 The cacosh functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 139, §7.3.6.2 The casinh functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 139, §7.3.6.3 The catanh functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 140, §7.3.6.4 The ccosh functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 140, §7.3.6.5 The csinh functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 140, §7.3.6.6 The ctanh functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 140, §7.3.7.1 The cexp functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 141, §7.3.7.2 The clog functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ 命名規則に従えば complex 版の fabs なので cfabs ですが、cabs は例外です。
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 141, §7.3.8.1 The cabs functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 141, §7.3.8.2 The cpow functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 142, §7.3.8.3 The csqrt functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 142, §7.3.9.1 The carg functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 142, §7.3.9.2 The cimag functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ 同名のFortran組み込み関数と機能的に同等です。
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 142, §7.3.9.3 The CMPLX macros. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 143, §7.3.9.4 The conj functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 143, §7.3.9.5 The cproj functions. オリジナルの2018-12-30時点によるアーカイブ。 .
- ^ N2176 C17 ballot ISO/IEC 9899:2017. ISO/IEC JTC1/SC22/WG14. p. 143, §7.3.9.6 The creal functions. オリジナルの2018-12-30時点によるアーカイブ。 .
参考文献
[編集]- ISO/IEC 9899:2018(en) Information technology — Programming languages — C. ISO/IEC. (2018-07-05) .
- WG14/N1256 Committee Draft — Septermber 7, 2007 ISO/IEC 9899:TC3. ISO/IEC . -- C99:TC3相当
- N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC . -- C11相当