數學庫是一個龐大的庫,而且數學函數的實現一般要涉及到特有的數值算法,因此這里也是作一個概述性的介紹。標準C中的數學庫有3個頭文件math.h, tgmath.h和complex.h,其中tgmath.h和complex.h是C99中引入的。標準C中定義的數學函數主要是初等函數,包括絕對值函數、高斯函數(即求最近整數)、指數函數、對數函數、冪函數、三角函數與反三角函數、雙曲函數與反雙曲函數等。非初等函數主要有誤差函數、gamma函數及其自然對數。其他的還有浮點數分類函數、浮點數比較函數。glibc的數學庫實現在math目錄下。
數學函數在math.h中聲明,復數運算及其函數在complex.h中聲明。C99對每個數學函數增加了兩個分別針對float和long double的版本,只要在函數名后加f和l即可。由于每個函數對不同的參數類型有多個版本,使用起來不方便,因此C99在tgmath.h中定義了通用類型宏,這些宏與原始的針對double類型的數學函數同名,它會根據傳過來的實參類型自動調用多個版本中的某一個版本。若函數結果無法表示為返回類型的值,則errno設置為ERANGE,并返回該類型的同符號的最大可浮點數值,在C89中為宏HUGE_VAL的值,C99中還提供了宏HUGE_VALF,HUGE_VALL。
math.h中所有的標準函數接口如下:
1、abs,labs,llabs,div,ldiv,lldiv:整型的絕對值,及除法運算,這些數學函數在stdlib.h中定義。
2、fabs:返回double型參數的絕對值,C99中增加了對應的f版本和l版本。
3、ceil,floor,lrint,llrint,lround,llround,mearbyint,round,rint,trunc:計算與浮點數參數接近的整數,有對應的f和l版本,除ceil和floor外都是C99中新增的。返回整數值,但返回類型很多都設為浮點型,因為得到的整數可能太大,無法用整型表示。
4、fmod,remainder,remquo:返回x/y的浮點數余數的近似值,有對應的f和l版本,除fmod外都是C99中新增的。
5、frexp,ldexp,modf,scalbn,scalbln:獲取浮點數的整數和小數部分,scalbn/scalbln將浮點數x乘以b**n,其中b是FLT_RADIX。都有對應的f和l版本,除frexp外都是C99中新增的。
6、exp,exp2,expml,logb/ilogb,log,log10,log2,log1p:計算e**x,、2**x、 e**(x-1)、logb/ilogb從浮點數x的表示中取指數、 自然對數、10為底的對數、2為底的對數,都有對應的f和l版本,除exp,log,log10外都是C99中增加的。
7、cbrt,fma,hypot,pow,sqrt:計算x的立方根、x*y+z、x**2+y**2、x**y、x的非負平方根,有對應的f和l版本,除pow,sqrt外都是C99中增加的。
8、rand,srand,RAND_MAX:生成偽隨機數的函數,在stdlib.h中定義。
9、cos,sin,tan,cosh,sinh,tanh:余弦、正弦、正切、雙曲余弦、雙曲正弦、雙曲正切函數,參數x為弧度。有對應的f和l版本(C99中增加)。
10、acos,asin,atan,atan2,acosh,asinh,atanh:反三角函數,有對應的f和l版本,除acos,asin,atan,atan2外都是C99中增加的。
11、fdim,fmax,fmin:計算x與y的正差值、兩個參數中較大的值、兩個參數中較小的值。
12、erf,erfc,lgamma,tgamma:計算誤差函數、1-erf(x)、x的gamma函數的自然對數、x的gamma函數。有對應的f和l版本,都是C99中引入的。
13、fpclassify,isfinite,isinf,isnan,isnormal,signbit:給浮點數分類返回FP_INFINITE,FP_NAN,FP_NOR MAL,FP_SUBNORMAL或FP_ZERO值之一、是否是有限數(既不是無限大也不是NaN)、是否是無限大、是否是NaN、是否是規格化數、是否是負數。都是C99中引入的。
14、copysign,nan,nextafter,nexttoward:返回采用y的符號后的x、返回靜態NaN、返回y方向上x的下一個浮點數值、與nextaftter等價只是y為long double型。有對應的f和l版本,都是C99中引入的。
15、isgreater,isgreaterequal,isless,islessequal,islessgreater,isunordered:比較兩個浮點數。若兩個浮點數中有一個或兩個為NaN,則它們是無序的,都是C99中引入的。
對復數及其運算的支持由C99提供,在complex.h中,接口如下:
1、complex,_Complex_I,imaginary,_Imaginary_I,I:復數類型、虛數類型、虛數單位i。
2、CX_LIMITED_RANGE:這個標準雜注打開時表示可以使用復數乘法、除法與絕對值運算的"x+yi"實現版本(這個實現是不完善的,用acosx+ibsinx來實現才比較完善)。
3、ccos,csin,ctan,cacos,casin,catan:復數域內的三角函數,有對應的f和l版本。
4、ccosh,csinh,ctanh,cacosh,casinh,catanh:復數域內的雙曲函數,有對應的f和l版本。
5、cexp,clog,cabs,cpow,csqrt:復數域內的指數、對數、絕對值、冪函數,有對應的f和l版本。
6、carg,cimag,creal,conj,cproj:獲取象限角、虛數部分、實數部分、a=x及b=-y、Riemann球上的投影,有對應的f和l版本。
通用類型宏:C99中引入,在tgmath.h中定義。它包含了頭文件math.h和complex.h。通用類型T可以是float,double,long double,float complex,double complex或long double complex。REAL(T)表示與復數類型長度相同的實數類型。這些宏會根據傳來的參數展開成特定的math.h或complex.h中的函數。