在ISO/IEC 9899:1999标准(俗称C99)中,引入了一个对于信号处理领域非常有用且使用起来也非常方便的库——复数库。只需在你的C语言编译器中开启c99、gnu99、c11或gnu11任一一项,然后在源文件中包含``,即可使用这个库。

C99标准中引入了两个用于描述复数的关键字:`_Complex`和`_Imaginary`。`_Complex`结合float与double使用来表示一个复数。然而,我所使用的GCC 4.6版本尚未支持`_Imaginary`关键字(个人估计这辈子都不会支持了),因此在这里暂时先不多介绍。`_Imaginary`表示一个复数的虚部,个人估计用`_Imaginary`定义的数为一个纯虚数。

如果`_Complex`与一个float结合使用,那么其实数部分与虚数部分都是float类型。如果要用一个常量来表示一个单精度浮点的纯虚数,可以这样写:`1.0iF`,这里的i与F可以是大小写,因此写为`1.0if`也没有任何问题,编译器不会把这个if当作条件判断关键字。

如果`_Complex`与一个double结合使用,那么其实数部分与虚数部分都是double类型。如果要用一个常量来表示一个双精度浮点的纯虚数,可以这么写:`1.0i`。

下面是一个代码片段,你可以运行一下:

```c

#include

#include

int main() {

double complex num = 3 + 4i;

printf("实部: %lf\n", creal(num));

printf("虚部: %lf\n", cimag(num));

return 0;

}

```

在C11标准中,提供了对复数的初始化器(Initializer)。而在GCC中,还可以通过`__real__`和`__imag__`分别对复数访问其实部和虚部。以下是一个示例代码:

```c

#include

#include

int main() {

double complex num = (3 + 4i) * (1.0 + 2i);

printf("实部: %lf\n", __real__(num));

printf("虚部: %lf\n", __imag__(num));

return 0;

}

```