跳轉到內容

C 程式設計/tgmath.h

來自 Wikibooks,開放世界中的開放書籍

tgmath.h 是一個 標準 C 標頭檔案,它定義了許多型別通用的 ,這些宏可用於各種數學運算。此標頭檔案還包含 math.hcomplex.h。對於 math.hcomplex.h 標頭檔案中所有沒有 f (float) 或 l (long double) 字尾的函式,並且其對應型別為 double (modf() 除外),都有相應的宏。[1]

型別通用宏

[編輯 | 編輯原始碼]

型別通用宏是允許呼叫型別由宏中引數型別決定的函式的東西。這意味著,例如,x 被宣告為 int 資料型別,但 已被以這種方式呼叫

 tan((float)x)


那麼此表示式將具有型別 float[2]
此外,如果型別通用宏的任何引數或引數是複數,它將呼叫複數函式,否則將呼叫實數函式。最終,呼叫的函式型別取決於引數的最終轉換型別。[3]

依賴關係圖

[編輯 | 編輯原始碼]

下面的流程圖顯示了 tgmath.h 的依賴關係圖。[4]

依賴關係圖

來自 math.h 的函式

[編輯 | 編輯原始碼]

下面列出的函式僅處理實數引數並返回實數輸出。如果將複數引數傳遞給這些函式,則會返回 NaN 或其他特殊數字。[5]

名稱 描述
acos 反餘弦
asin 反正弦
atan 單引數反正切
atan2 雙引數反正切
ceil 向上取整,不小於引數的最小整數
cos 餘弦
cosh 雙曲餘弦
exp 指數函式
fabs 浮點數的絕對值
floor 向下取整,不大於引數的最大整數
fmod 浮點數的餘數
frexp 將數字分解為有效數字和 2 的冪
ldexp 按指數縮放浮點數 (參見文章)
log 自然對數
log10 以 10 為底的對數
modf(x,p) 返回 x 的小數部分,並將整數部分儲存在指標 p 指向的位置
pow(x,y) x 提高到 y 的冪,xy
sin 正弦
sinh 雙曲正弦
sqrt 平方根,返回該數字的非負平方根
tan 正切
tanh 雙曲正切
isgreater 如果 x > y,則返回 1,否則返回 0
isnan(x) 如果 x 是 NaN (非數字),則返回 1
islessequal 如果 x 小於或等於 y,則返回 1,否則返回 0
isinf(x) 表示 x 是否為無窮大
signbit 表示 x 是否為負數 (如果 x 小於 0,則返回 8,否則返回 0)

來自 complex.h 的函式

[編輯 | 編輯原始碼]

下面定義的函式處理複數引數,但不返回複數輸出。[5]

名稱 描述
cacos 反餘弦
casin 反正弦
catan 單引數反正切
catan2 雙引數反正切
cceil 向上取整,不小於引數的最小整數
ccos 餘弦
ccosh 雙曲餘弦
cexp 指數函式
cabs 複數浮點數的絕對值
cfloor 向下取整,不大於引數的最大整數
cfmod 浮點數的餘數
cfrexp 將數字分解為有效數字和 2 的冪
cldexp 按指數縮放浮點數 (參見文章)
clog 自然對數
clog10 以 10 為底的對數
cmodf(x,p) 返回 x 的小數部分,並將整數部分儲存在指標 p 指向的位置
cpow(x,y) x 提高到 y 的冪,xy
csin 正弦
csinh 雙曲正弦
csqrt 平方根,返回該數字的非負平方根
ctan 正切
ctanh 雙曲正切

使用示例

[編輯 | 編輯原始碼]

以下程式碼演示了 tgmath.h 中定義的 atan 函式的使用,該函式計算在正切域中定義的數字的反正切。

#include <stdio.h>
#include <tgmath.h>
int main()
{
        float ang, ans;
        scanf("%f", &ang);
        ans = atan(ang);
        printf("%0.3f\n", ans);
        return 0;
}

顯著差異

[編輯 | 編輯原始碼]

這裡定義的類似函式在計算“棘手”數字的返回值時存在顯著差異。例如,使用 sqrt 計算 -25 的平方根返回 -NaN (非數字),而 csqrt 返回 0.000000。在其他函式中也可能注意到此類差異。

基本原理

[編輯 | 編輯原始碼]

此標頭檔案主要在計算數學函式時包含。由於它包含了 math.hcomplex.h,因此解決了由於輸入不一致而產生的問題。單獨包含任何標頭檔案都會導致某些輸入的輸出不一致。

參考文獻

[編輯 | 編輯原始碼]
  1. http://www.opengroup.org/onlinepubs/009695399/basedefs/tgmath.h.html
  2. http://manpages.ubuntu.com/manpages/hardy/man7/tgmath.h.7posix.html
  3. http://www.qnx.com/developers/docs/6.4.1/dinkum_en/c99/tgmath.html
  4. http://www-zeuthen.desy.de/apewww/APE/software/nlibc/html/tgmath_8h.html
  5. a b http://pubs.opengroup.org/onlinepubs/009604599/basedefs/tgmath.h.html
[編輯 | 編輯原始碼]
華夏公益教科書