C99标准中使用复数Complex库
在ISO/IEC9899:1999标准(俗称C99)标准中引入了一个对于信号处理领域非常有用切使用起来也非常方便的库——复数库。对你的C语言编译器开启c99、gnu99、c11或gnu11任一一项之后在源文件中包含<complex.h>即可使用。
C99标准中引入了两个用于描述复数的关键字——_Complex和_Imaginary。_Complex结合float与double使用来表示一个复数。由于我所用的GCC4.6版本尚未支持_Imaginary关键字(个人估计这辈子都不会支持了),因此在这里暂时先不多介绍。_Imaginary表示一个复数的虚部,个人估计用_Imaginary定义的数为一个纯虚数。
如果_Complex与一个float结合使用,那么其实数部分与虚数部分都是float类型。如果要用一个常量来表示一个单精度浮点的纯虚数其实可以这么写:1.0iF,这里的i与F即可以是大小也可以是小写,因此写为1.0if也没有任何问题,编译器不会蠢到把这个if当作为条件判断关键字。
如果_Complex与一个double结合使用,那么其实数部分与虚数部分都是double类型。如果要用一个常量来表示一个双精度浮点的纯虚数可以这么写:1.0i。
下面贴个代码片段,各位可以运行一下:
#include <math.h> #include <stdio.h> #include <complex.h> int main(void) { float _Complex f = -1.0f; f = csqrtf(f) + 1.0iF; printf("The complex number is: %g+i%g\n", crealf(f), cimagf(f)); double _Complex d = cexp(2.0i * M_PI); printf("e^(i2PI) = %f+i%f\n", creal(d), cimag(d)); }
库函数中的creal(double _Complex)是取一个复数的实部;cimag(double _Complex)是取一个复数的虚部。
在C11标准中,提供了对复数的初始化器(Initializer),而在GCC中还能通过__real__与__imag__对分别对复数访问其实部和虚部。如下代码示例:
#include <complex.h> int main(void) { complex float cf = { 10.25f, -0.5f }; printf("The real part is: %.2f, and the imaginary part is: %.2f\n", __real__(cf), __imag__(cf)); }