天天看點

math.h

總所周知,最早的函數庫幾乎完全由計算常用數學函數的函數組成。至于20世紀50年代出現的FORTRAN就是以它的功能Formula Translation(公式轉換)的縮寫得來。

math.h的每一個函數都能接受定義域内的所有參數值,對于其他所有的參數都報告定義域錯誤。發生定義域錯誤時,errno設定為EDOM。如果輸入的不是數字,那麼函數傳回一個表示非數字的特殊編碼NaN(即Not a number)。對于一個輸入的具體的值,函數産生一個确定的結果。而對于所有的結果的值太小或者太大而不能表示的值,函數報告值域錯誤。如果函數産生的結果數值太大,那麼函數就傳回一個表示正無窮大的特殊編碼+Inf,或者負無窮大的編碼-Inf;如果結果太小而不能表示,就傳回0.一般來說,結果不能表示為double類型值時,發生值域錯誤。如果結果上溢,函數傳回宏HUGE_VAL的值,并且errno設定為宏ERANGE,如果結果下溢,函數傳回0。對于任何可以表示的結果,函數都盡可能地把精度誤差控制在兩位以内。最後一點,所有math.h頭檔案裡生命的函數的傳回類型和參數值都是double類型,并且中間結果也是用double類型來表示。

接下來是math.h頭檔案庫函數的介紹:

#include <math.h>
double acos(double x);
           

acos計算x的三角反餘弦函數主值。如果參數x不在[-1, +1]範圍内,則發生定義域錯誤。函數傳回[0, π]弧度範圍内的反餘弦值。注意函數acos和asin經常使用同一個内部函數來計算。每一個函數都在給出一個直角三角形的一個條直角邊和斜邊的前提下計算出它的一個瑞角值。是以,注意acos的參數是一個比例量,是以,最好去調用asin、atan或者atan2。

#include <math.h>
double asin(double x);
           

asin計算x的三角反正弦函數主值。如果參數不在[-1, +1]範圍内,則發生定義域錯誤。函數傳回[-π/2, +π/2]弧度範圍内的反正弦值。

#include <math.h>
double atan(double x);
           

atan計算x的三角反正切函數主值。函數atan傳回[-π/2, +π/2]弧度範圍内的反正切值。這個函數不是很常用,最好調用atan2。

#include <math.h>
double atan2(double y, double x);
           

atan2計算y/x的三角反正切函數主值,根據兩個參數的符号确定傳回值的象限資訊。如果兩個參數都為0,則發生定義域錯誤。函數atan2傳回y/x的反正切,在[-π, +π]弧度範圍内。

#include <math.h>
double cos(double x);
           

cos計算x(機關為弧度)的餘弦值。函數cos傳回餘弦值。函數cos和sin使用同一個内部函數來計算。每一個函數都能把它們的參數以X軸或者Y軸為中心減小到π弧度的範圍。注意,函數可以消除2 * π的倍數,但是參數每增加一個2 * π,cos的結果的精度幾乎就會減少3位。如果一個參數足夠大,那麼這個函數傳回的結果可能是沒有意義的。

#include <math.h>
double sin(double x);
           

sin計算x(以弧度為機關)的正弦值。函數sin傳回正弦值。

#include <tan.h>
double tan(double x);
           

tan傳回x(以弧度為機關)的正切值。函數傳回正切值。

#include <math.h>
double cosh(double x);
           

cosh計算x的雙曲餘弦。如果x的數值太大,則發生值域錯誤。函數cosh傳回雙曲餘弦值。關于雙曲餘弦:雙曲餘弦函數是雙曲函數的一種。我們知道三角函數分正弦sin、餘弦cos、正切tan、餘切cot、正割sec、餘割csc六種。那麼,類似的,雙曲函數也分為雙曲正弦、雙曲餘弦、雙曲正切、雙曲餘切、雙曲正割、雙曲餘割六種。雙曲餘弦函數也是其中一種。雙曲餘弦函數記作cosh,也可簡寫為ch。曲餘弦函數的定義域為(-Inf, +Inf),值域為[1, +Inf)。x == 0時,函數值最小為1。如圖:

math.h
#include <math.h>
double sinh(double x);
           

sinh計算x的雙曲正弦,如果x的數值太大,發生值域錯誤。函數sinh傳回雙曲正弦值。定義域範圍(-Inf, +Inf),值域範圍(-Inf, +Inf)。

#include <math.h>
double tanh(double x);
           

tanh計算x的雙曲正切。函數tanh傳回雙曲正切值。雙曲正切函數圖像如下:

math.h

定義域為(-Inf, +Inf),值域為(-1, +1)。注意隻是無限逼近-1或者+1。

#include <math.h>
double exp(double x);
           

函數exp計算以科學常數e(e = 2.71828…)為底的x的指數函數(即y = e ^ x)。如果x的數值太大,則發生值域錯誤。函數傳回指數函數y的值。如果exp的參數具有y * log(x)的形式,那麼就用pow(x, y)代替,後者更精确。

#include <math.h>
double frexp(double value, int *exp);
           

函數frexp把一個浮點數分為一個規格化小數和一個2的整數幂。它把整數值存儲在exp指向的int類型的對象中。函數frexp傳回x,使x為[1/2, 1)範圍内的double值,或者為0,而且value等于x乘以2的*exp次幂。如果value為0,則結果的兩部分都為0。也就是說frexp将一個double值分成兩個值乘積的一個表達式。

#include <math.h>
double ldexp(double x, int exp);
           

函數ldexp計算一個浮點數和2的整數幂的乘積,有可能發生值域錯誤。函數ldexp傳回x乘以2的exp次幂的值。注意,ldexp和frexp是互逆的操作。

#include <math.h>
double log(double x);
           

函數log計算x的自然對數。如果參數為負,則發生定義域錯誤;如果參數為0,則發生值域錯誤。函數log傳回自然對數值(ln x)。

#include <math.h>
double log10(double x);
           

函數log10計算x的以10為底的對數。如果參數為負,則發生定義域錯誤;如果參數為0,則可能發生值域錯誤。函數log10傳回以10為底的對數。

#include <math.h>
double modf(double value, double *iptr);
           

函數modf把參數value分成整數部分和小數部分。它們的符号和參數相同。它把整數部分存儲在iptr指向的double類型對象中。函數modf傳回value的帶符号的小數部分。注意這個函數就是将一個double值表示為兩數之和的一個表達式。

#include <math.h>
double pow(double x, double y);
           

函數pow計算x的y次幂。如果x為負值而且y不是一個整數值,則發生定義域錯誤。當x為0且y小于等于0時,如果結果不能表示,則發生定義域錯誤。也可能發生值域錯誤。函數pow傳回x的y次幂。當科學常數e是x參數值時,可以用exp(y)代替pow(e, y),exp更精确。使用sqrt(x)代替pow(x, 0.5),用x * x替代pow(x, 2.0)。

#include <math.h>
double sqrt(double x);
           

函數sqrt計算x的非負平方根。如果參數為負,則發生定義域錯誤。函數sqrt傳回平方根的值。

#include <math.h>
double ceil(double x);
           

函數ceil計算不小于x的最小整數。函數ceil傳回不小于x的最小整數,表示為double類型。使用函數ceil、floor和modf比把浮點數轉換成整數類型安全得多,因為它們可以對任意的浮點值進行操作而不會造成溢出。如果想要得到和浮點值x最接近的整數可以寫:

x < 0.0 ? ceil(x - 0.5) : floor(x + 0.5);

#include <math.h>
double fabs(double x);
           

函數fabs計算浮點數x的絕對值。函數fabs傳回x的絕對值。

#include <math.h>
double floor(double x);
           

函數floor計算不大于x的最大整數。函數floor傳回不大于x的最大整數,表示為double類型。

#include <math.h>
double fmod(double x, double y);
           

函數計算x/y的浮點餘數。對于某個整數值i,函數fmod傳回值x - i * y。是以如果y不為0,結果的符号和x相同而且數值上比y小;如果y為0,則或者發生定義域錯誤,或者函數fmod傳回0。

一些補充:

HUGE_VAL——這個宏通常會展開為一個非常大的double常量,一般情況下和float.h中定義的DBL_MAX的展開值相等。在那些對無窮大(Inf)不提供特殊編碼的機器上,通常認為傳回這樣一個大值是警告發生了值域錯誤的最好方式。将一個數學函數的傳回值和HUGE_VAL或者-HUGE_VAL相比較可能會比較安全。

繼續閱讀