http://en.cppreference.com/w/c/header ,
在這裏,可以知道C標準庫的變革,可以看出那些來自(C99), 那些來自(C11),
對於寫出合乎標準的C程式,是很好的參考。
裏面還有範例,而範例竟然還可以直接線上編譯,如果本機沒有安裝C編譯器,可以在網頁上執行。
在http://coliru.stacked-crooked.com/
線上馬上體驗這個古老的語言。
今天研究了一下,複數是只有國中/高中會用到的數學,
標準庫在C99開始支援,所以實作這類複數計算的第三方庫,如果功能不是太特別的話,應該使用C 標準庫裏的**<complex.h>,**
就可以直接用float complez z1, double complex z2, long double complex z3 這樣的寫法。
而同時在C99又引入了**<tgmath.h>**的概念,(macros wrapping math.h and complex.h),感覺很有泛型的味道。
看一個例子:
#include <stdio.h>
#include <tgmath.h>
int main(void)
{
// macro -> function call
int i = 1;
printf("cos(1) = %f\n", cos(i) ); // -> cos(i)
float f = 0.5;
printf("sin(0.5) = %f\n", sin(f) ); // -> sinf(f)
long double ld = 1;
printf("acos(1) = %Lf\n", acos(ld)); // -> acosl(d)
double complex dc = 1 + 0.5*I;
double complex result = sqrt(dc); // -> csqrt(dc);
printf("sqrt(1 + 0.5i) = %f+%fi\n", creal(result), cimag(result));
}
------------------------------------------------
以下為編譯及執行
$ make tgmath
cc -g -Wall -std=gnu11 -O3 tgmath.c -o tgmath
tgmath.c: In function 'main':
tgmath.c:14:5: warning: unknown conversion type character 'L' in format [-Wforma
t=]
printf("acos(1) = %Lf\n", acos(ld)); // -> acosl(d)
^
tgmath.c:14:5: warning: too many arguments for format [-Wformat-extra-args]
tim_lo@USER360 ~/std_c
$ ./tgmath
cos(1) = 0.540302
sin(0.5) = 0.479426
acos(1) = 0.000000
sqrt(1 + 0.5i) = 1.029086+0.242934i
這個wrapper macro的好處,就是不用再用ccos, csin, csqrt, 這些c開頭(complex)的複數計算函數,可以統一都用在**<math.h>**裏定義的數學計算函數同名。