iT邦幫忙

DAY 14
0

21世紀C語言實作及感想系列 第 14

21世紀C語言之14 :C 標準庫 ,依表頭檔(.h)分類

  • 分享至 

  • xImage
  •  

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>**裏定義的數學計算函數同名。


上一篇
21世紀C語言之13 :C 標準庫 ,glibc
下一篇
21世紀C語言之15 :巨集的困惑
系列文
21世紀C語言實作及感想30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言