math library提供了許多常見的數學運算函式,其中也包括三角函數。然而對於圓周率(pi)值並沒有常數的定義,我們可以利用反三角函數來取得pi值:
圓周率 = 4 * atan(1)
在數學運算中,我們比較熟悉的是夾角的角度,而math library的三角函數回傳值皆以弧度(radian),所以我們可以自行定義一個常數來轉換。
#define RADIAN_TO_DEGREE (180 / (4 * atan(1)))
2008年9月30日 星期二
取得圓周率值
2008年9月29日 星期一
ldd
ldd可以用來顯示每個程式所使用到的shared library。ldd其實是一個shell script而不是執行檔。
在linux,我們可以將程式編譯成靜態連結或是動態連結,在這以hello.c來解釋。#include
int main(void) {
printf("Hello world!\n");
return 0;
}
用gcc編譯
# gcc hello.c -o hello
則會產生hello的執行檔,而其預設是使用動態連結的方式:
用file指令來檢視其屬性
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
用ldd來檢視共用了哪些shared library
# ldd hello
linux-gate.so.1 => (0xb7f6a000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7dfd000)
/lib/ld-linux.so.2 (0xb7f6b000)
此外,此檔案的大小為
# ls -l hello
-rwxr-xr-x 1 howard howard 6256 2008-09-30 00:00 hello
上述為程式使用動態連結,我們也可以將程式編譯成靜態連結:
# gcc -static hello.c -o hello
用file來檢視,可以看到顯示為靜態連結
# file hello
hello: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, for GNU/Linux 2.6.8, not stripped
用ldd來檢視,自然沒使用到任何shared library
# ldd hello
not a dynamic executable
再來檢視檔案的大小
# ls -l hello
-rwxr-xr-x 1 howard howard 564881 2008-09-30 00:07 hello
我們可以看到檔案大小為564881 Bytes,相對於之前用動態連結只用了6256 Bytes,足足大上快一百倍。可見使用動態連結能大大節省空間。
2008年9月28日 星期日
Linux Library
Program library指的就是包含已編譯好的程式碼和資料,可以拿來被其它程式來運作。可以依程式與library結合的時間將library分成三類:
- static library:
- shared library:
- dynamically loaded library:
2008年9月27日 星期六
願者上鉤
2008年9月25日 星期四
三聚氰胺
毒奶粉事件愈演愈烈,主要的原兇就是三聚氰胺。那就來對三聚氰胺做個簡介:
摘錄自衛生署網站
三聚氰胺(Melamine):
它是一種白色化工原料,無味、略溶於水,可溶於酒精、甲醇,常用於製告美耐皿餐具、建材、塗料,具毒性,不可添加於食品。
對人體的危害:
經腸胃吸收後,可能於腎臟中結合沈積,形成腎結石,嚴重者會造成腎臟功能受損;這種現象較易發生在腎臟尚未發育完全的嬰幼兒。
不肖廠商為什麼要在奶粉中添加三聚氰胺?
奶粉主要以蛋白質含量高低為品級分類,為通過奶粉中蛋白質含量檢測,不肖廠商才加入三聚氰胺。
macro與inline差異
C99標準新增了inline function的定義,標準說:「Making a function an inline function suggests that calls to the function be as fast as possible.」其中由suggest一詞就可以知道實際的運作要看compiler如何實作,也許真的會讓function的呼叫變快,也可能什麼事都沒發生。
而macro與inline的差異:
- macro是由preprocessor處理,由inline則是compiler來負責
- macro對於檢查傳入參數的型別,而inline則會檢查型別
假設定義平方的巨集如下:
#define SQUARE(x) x * x若執行
SQUARE(3+2);
則答案並不會預期印出25,而是11,因為macro只是當純的文字替換,所以式子將會變成:
3 + 2 * 3 + 2
因此,正確安全的寫法如下:
#define SQUARE(x) ((x) * (x))而inline的寫法就和一般的function寫法一樣:
inline int square(int x) {
return x * x;
}
