I
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <complex.h> で定義
|
||
#define I /* unspecified */ |
(C99以上) | |
I は _Complex_I または _Imaginary_I のいずれかに展開されるマクロです。 処理系が虚数型をサポートしていなければ常に _Complex_I に展開されます。
プログラムはマクロ I を削除したりその後再定義したりしても構いません。
ノート
このマクロは i とは名付けられませんでした。 数学では虚数単位の名前は i ですが、 i はすでに多くのCのプログラムでループカウンタ変数などに使われていたためです。
マクロ I は複素数を形成するために x + y*I のような式でよく使われます。
I が _Complex_I として定義されている場合、こういった式は y が -0.0 の場合でも虚部が +0.0 の値を作り出す場合があります。 これは分岐切断を持つ複素関数では重要になります。 CMPLX マクロを使うと複素数を正確に構築できます。
GCC では移植性のない拡張として数値リテラルに接尾辞 i を指定することで虚数定数を記述できます。 1.0fi、 1.0i、 1.0li は GNU C では虚数単位を表します。 C++14 以降、標準 C++ でも同様の手法が採用されています (1.0if、 1.0i、 1.0il は C++ では虚数単位を表します)。
例
Run this code
#include <stdio.h>
#include <complex.h>
int main(void)
{
printf("I = %.1f%+.1fi\n", creal(I), cimag(I));
double complex z1 = I * I; // 虚数単位の2乗
printf("I * I = %.1f%+.1fi\n", creal(z1), cimag(z1));
double complex z = 1.0 + 2.0*I; // C11より前の複素数を形成する普通の方法
printf("z = %.1f%+.1fi\n", creal(z), cimag(z));
}
出力:
I = 0.0+1.0i
I * I = -1.0+0.0i
z = 1.0+2.0i
参考文献
- C11 standard (ISO/IEC 9899:2011):
- 7.3.1/6 I (p: 188)
- G.6/1 I (p: 537)
- C99 standard (ISO/IEC 9899:1999):
- 7.3.1/4 I (p: 170)
- G.6/1 I (p: 472)
関連項目
(C99) |
虚数単位 i を表す虚数型の定数 (マクロ定数) |
(C99) |
虚数単位 i を表す複素数型の定数 (マクロ定数) |
(C11)(C11)(C11) |
実部と虚部から複素数を構築します (関数マクロ) |
operator""i の C++リファレンス
| |