在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)); }