Namespaces
Variants

I

From cppreference.net
定義済みヘッダー <complex.h>
#define I /* unspecified */
(C99以降)

I マクロは、 _Complex_I または _Imaginary_I のいずれかに展開されます。実装が虚数型をサポートしていない場合、このマクロは常に _Complex_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++における虚数単位です)

#include <stdio.h>
#include <complex.h>
int main(void)
{
    printf("I = %.1f%+.1fi\n", creal(I), cimag(I));
    double complex z1 = I * I;     // 虚数単位の二乗
    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標準 (ISO/IEC 9899:2011):
  • 7.3.1/6 I (p: 188)
  • G.6/1 I (p: 537)
  • C99標準 (ISO/IEC 9899:1999):
  • 7.3.1/4 I (p: 170)
  • G.6/1 I (p: 472)

関連項目

虚数単位定数 i
(マクロ定数)
複素数単位定数 i
(マクロ定数)
(C11) (C11) (C11)
実部と虚部から複素数を構築する
(関数マクロ)
C++ドキュメント for operator""i