复数(complex)
`complex.h` 是 C 标准函数库中的头文件,提供了复数算术所需要的宏定义与函数声明。C99 规定了关键字 `_Complex`,因此有 3 种复数类型:double _Complex、float _Complex 和 long double _Complex。次序不是必须遵守的,比如 float _Complex 也可以写成 _Complex float。`_Complex_I` 扩展为类型为 const float _Complex 的常量值,其值为虚数单位。C99 规定 complex 作为宏扩展为 _Complex。但 C++ 未定义 complex 宏。gcc 仅支持 complex type,不支持 imaginary type。因此宏 I 扩展为 _Complex_I。
里面还包含了不少支持复数的数学函数(c 打头的就是):
1. ccos, csin, ctan, cacos, casin, catan:复数域内的三角函数,有对应的 f 和 l 版本。
2. ccosh, csinh, ctanh, cacosh, casinh, catanh:复数域内的双曲函数,有对应的 f 和 l 版本。
3. cexp, clog, cabs, cpow, csqrt:复数域内的指数、对数、绝对值、幂函数,有对应的 f 和 l 版本。
4. carg, cimag, creal, conj, cproj:获取象限角、虚数部分、实数部分、a=x及b=-y、Riemann 球上的投影,有对应的 f 和 l 版本。
代码示例:
```c
#include
#include
int main()
{
double complex cmp = 1.3 + 2.3 * I;
printf("%f + %fi
", creal(cmp), cimag(cmp));
return 0;
}
```
99 新增了复数类型(_Complex)和虚数类型(_Imaginary)。简单来说,C99 提供了三种复数类型:float _Complex、double _Complex 和 long double _Complex。对于 float _Complex 类型的变量来说,它包含两个 float 类型的值,一个用于表示复数的实部(real part),另一个用于表示虚部(imaginary part)。类似地,double _Complex 包含两个 double 类型的值。C99 还提供了三种虚数类型:float _Imaginary、double _Imaginary 以及 long double _Imaginary。虚数类型只有虚部,没有实部。
在使用这些复数类型之前,需要包含标准头文件 complex.h。例如:
```c
#include
double _Complex x = 5.2;
double complex y = 5.0 * I;
double complex z = 5.2 - 5.0 * I;
```
需要注意的是,_Complex 类型对于独立式环境(freestanding environment)来说是可选的。这意味着不强制必须支持这种类型。独立式环境是指 C 程序可以在没有操作系统的情况下运行。而 _Imaginary 类型在任何环境下都是可选的。目前的编译器对这两种类型的支持都不太好。