Unix/Linux環境C程式設計入門教程(31) 數學函式帶你戰勝企業面試

尹成發表於2014-07-23

1.函式介紹:

abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh()sqrt()tan()tanh()

   



abs(計算整型數的絕對值)

相關函式

labs, fabs

表標頭檔案

#include<stdlib.h>

定義函式

int abs (int j)

函式說明

abs()用來計算引數j的絕對值,然後將結果返回。

返回值

返回引數j的絕對值結果。

範例

#ingclude <stdlib.h>
main(){
int ansert;
answer = abs(-12);
printf("|-12| = %d\n", answer);
}

執行

|-12| = 12

   




acos(取反餘弦函式數值)

相關函式

asin , atan , atan2 , cos , sin , tan

表標頭檔案

#include <math.h>

定義函式

double acos (double x);

函式說明

acos()用來計算引數x的反餘弦值,然後將結果返回。引數x範圍為-1至1之間,超過此範圍則會失敗。

返回值

返回0至PI之間的計算結果,單位為弧度,在函式庫中角度均以弧度來表示。

錯誤程式碼

EDOM引數x超出範圍。

附加說明

使用GCC編譯時請加入-lm。

範例

#include <math.h>
main (){
double angle;
angle = acos(0.5);
printf("angle = %f\n", angle);
}

執行

angle = 1.047198

   




asin(取反正弦函式值)

相關函式

acos , atan , atan2 , cos , sin , tan

表標頭檔案

#include <math.h>

定義函式

double asin (double x)

函式說明

asin()用來計算引數x的反正弦值,然後將結果返回。引數x範圍為-1至1之間,超過此範圍則會失敗。

返回值

返回-PI/2之PI/2之間的計算結果。

錯誤程式碼

EDOM引數x超出範圍

附加說明

使用GCC編譯時請加入-lm

範例

#include<math.h>
main()
{
double angle;
angle = asin (0.5);
printf("angle = %f\n",angle);
}

執行

angle = 0.523599

   




atan(取反正切函式值)

相關函式

acos,asin,atan2,cos,sin,tan

表標頭檔案

#include<math.h>

定義函式

double atan(double x);

函式說明

atan()用來計算引數x的反正切值,然後將結果返回。

返回值

返回-PI/2至PI/2之間的計算結果。

附加說明

使用GCC編譯時請加入-lm

範例

#include<math.h>
main()
{
double angle;
angle =atan(1);
printf("angle = %f\n",angle);
}

執行

angle = 1.570796

   




atan2(取得反正切函式值)

相關函式

acos,asin,atan,cos,sin,tan

表標頭檔案

#include<math.h>

定義函式

double atan2(double y,double x);

函式說明

atan2()用來計算引數y/x的反正切值,然後將結果返回。

返回值

返回-PI/2 至PI/2 之間的計算結果。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double angle;
angle = atan2(1,2);
printf("angle = %f\n", angle);
}

執行

angle = 0.463648

   




ceil(取不小於引數的最小整型數)

相關函式

fabs

表標頭檔案

#include <math.h>

定義函式

double ceil (double x);

函式說明

ceil()會返回不小於引數x的最小整數值,結果以double形態返回。

返回值

返回不小於引數x的最小整數值。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double value[ ]={4.8,1.12,-2.2,0};
int i;
for (i=0;value[i]!=0;i++)
printf("%f=>%f\n",value[i],ceil(value[i]));
}

執行

4.800000=>5.000000
1.120000=>2.000000
-2.200000=>-2.000000

   




cos(取餘玄函式值)

相關函式

acos,asin,atan,atan2,sin,tan

表標頭檔案

#include<math.h>

定義函式

double cos(double x);

函式說明

cos()用來計算引數x 的餘玄值,然後將結果返回。

返回值

返回-1至1之間的計算結果。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer = cos(0.5);
printf("cos (0.5) = %f\n",answer);
}

執行

cos(0.5) = 0.877583

   




cosh(取雙曲線餘玄函式值)

相關函式

sinh,tanh

表標頭檔案

#include<math.h>

定義函式

double cosh(double x);

函式說明

cosh()用來計算引數x的雙曲線餘玄值,然後將結果返回。數學定義式為:(exp(x)+exp(-x))/2。

返回值

返回引數x的雙曲線餘玄值。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer = cosh(0.5);
printf("cosh(0.5) = %f\n",answer);
}

執行

cosh(0.5) = 1.127626

   




exp(計算指數)

相關函式

log,log10,pow

表標頭檔案

#include<math.h>

定義函式

double exp(double x);

函式說明

exp()用來計算以e為底的x次方值,即ex值,然後將結果返回。

返回值

返回e的x次方計算結果。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer;
answer = exp (10);
printf("e^10 =%f\n", answer);
}

執行

e^10 = 22026.465795

   




frexp(將浮點型數分為底數與指數)

相關函式

ldexp,modf

表標頭檔案

#include<math.h>

定義函式

double frexp( double x, int *exp);

函式說明

frexp()用來將引數x 的浮點型數切割成底數和指數。底數部分直接返回,指數部分則借引數exp 指標返回,將返回值乘以2 的exp次方即為x的值。

返回值

返回引數x的底數部分,指數部分則存於exp指標所指的地址。

附加說明

使用GCC編譯時請加入-lm。

範例

#include <math.h>
main()
{
int exp;
double fraction;
fraction = frexp (1024,&exp);
printf("exp = %d\n",exp);
printf("fraction = %f\n", fraction);
}

執行

exp = 11
fraction = 0.500000 /* 0.5*(2^11)=1024*/

   




ldexp(計算2的次方值)

相關函式

frexp

表標頭檔案

#include<math.h>

定義函式

double ldexp(double x,int exp);

函式說明

ldexp()用來將引數x乘上2的exp次方值,即x*2exp。

返回值

返回計算結果。

附加說明

使用GCC編譯時請加入-lm。

範例:

/* 計算3*(2^2)=12 */
#include<math.h>
main()
{
int exp;
double x,answer;
answer = ldexp(3,2);
printf("3*2^(2) = %f\n",answer);
}

執行

3*2^(2) = 12.000000

   




log(計算以e 為底的對數值)

相關函式

exp,log10,pow

表標頭檔案

#include <math.h>

定義函式

double log (double x);

函式說明

log()用來計算以e為底的x 對數值,然後將結果返回。

返回值

返回引數x的自然對數值。

錯誤程式碼

EDOM 引數x為負數,ERANGE 引數x為零值,零的對數值無定義。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer;
answer = log (100);
printf("log(100) = %f\n",answer);
}

執行

log(100) = 4.605170

   




log10(計算以10 為底的對數值)

相關函式

exp,log,pow

表標頭檔案

#include<math.h>

定義函式

double log10(double x);

函式說明

log10()用來計算以10為底的x對數值,然後將結果返回。

返回值

返回引數x以10為底的對數值。

錯誤程式碼

EDOM引數x為負數。RANGE引數x為零值,零的對數值無定義。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer;
answer = log10(100);
printf("log10(100) = %f\n",answer);
}

執行

log10(100) = 2.000000

   




pow(計算次方值)

相關函式

exp,log,log10

表標頭檔案

#include<math.h>

定義函式

double pow(double x,double y);

函式說明

pow()用來計算以x為底的y次方值,即xy值,然後將結果返回。

返回值

返回x的y次方計算結果。

錯誤程式碼

EDOM 引數x為負數且引數y不是整數。

附加說明

使用GCC編譯時請加入-lm。

範例

#include <math.h>
main()
{
double answer;
answer =pow(2,10);
printf("2^10 = %f\n", answer);
}

執行

2^10 = 1024.000000

   




sin(取正玄函式值)

相關函式

acos,asin,atan,atan2,cos,tan

表標頭檔案

#include<math.h>

定義函式

double sin(double x);

函式說明

sin()用來計算引數x的正玄值,然後將結果返回。

返回值

返回-1 至1之間的計算結果。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer = sin (0.5);
printf("sin(0.5) = %f\n",answer);
}

執行

sin(0.5) = 0.479426

   




sinh(取雙曲線正玄函式值)

相關函式

cosh,tanh

表標頭檔案

#include<math.h>

定義函式

double sinh( double x);

函式說明

sinh()用來計算引數x的雙曲線正玄值,然後將結果返回。數學定義式為:(exp(x)-exp(-x))/2。

返回值

返回引數x的雙曲線正玄值。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer = sinh (0.5);
printf("sinh(0.5) = %f\n",answer);
}

執行

sinh(0.5) = 0.521095

   




sqrt(計算平方根值)

相關函式

hypotq

表標頭檔案

#include<math.h>

定義函式

double sqrt(double x);

函式說明

sqrt()用來計算引數x的平方根,然後將結果返回。引數x必須為正數。

返回值

返回引數x的平方根值。

錯誤程式碼

EDOM 引數x為負數。

附加說明

使用GCC編譯時請加入-lm。

範例

/* 計算200的平方根值*/
#include<math.h>
main()
{
double root;
root = sqrt (200);
printf("answer is %f\n",root);
}

執行

answer is 14.142136

   




tan(取正切函式值)

相關函式

atan,atan2,cos,sin

表標頭檔案

#include <math.h>

定義函式

double tan(double x);

函式說明

tan()用來計算引數x的正切值,然後將結果返回。

返回值

返回引數x的正切值。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer = tan(0.5);
printf("tan (0.5) = %f\n",answer);
}

執行

tan(0.5) = 0.546302

   




tanh(取雙曲線正切函式值)

相關函式

cosh,sinh

表標頭檔案

#include<math.h>

定義函式

double tanh(double x);

函式說明

tanh()用來計算引數x的雙曲線正切值,然後將結果返回。數學定義式為:sinh(x)/cosh(x)。

返回值

返回引數x的雙曲線正切值。

附加說明

使用GCC編譯時請加入-lm。

範例

#include<math.h>
main()
{
double answer = tanh(0.5);
printf("tanh(0.5) = %f\n",answer);
}

執行

tanh(0.5) = 0.462117

   


2.企業面試實戰演練

題目如下:

現有1個點和10000個位置半徑各不同的圓,為了判斷改點被包含在哪些圓內,需要一個函式判斷點(px,py)是否於圓心(x,y)半徑r的圓內,請儘快優化執行速度。

函式原型:

bool IsPointInCircle(int px,int py,int x,int y,int r);

 

流程設計如下:

採用模組化的設計思想,我們建立1個函式

int CreateCircle(int n);

CreateCircle函式功能就是接受引數n並建立n個圓圈,圓心座標隨機產生,半徑也隨機產生

    將建立好的圓圈與點(px,py)進行遊戲中的 "碰撞檢測"

我們加上本專題的第一篇部落格測試程式執行時間。經過本人測試發現10000個圓圈根本就測試不出時間,所以我們在專案中改成了1000,000個圓圈。

另外C語言中沒有內建型別bool 所以我們需要換成int

專案實現

#include <stdio.h>

#include <math.h>

#include <time.h>

#include <stdlib.h>

 

int main(void)

{

 	int CreateCircle(int n,int px,int py);

 	int IsPointInCircle(int px,int py,int x,int y,int r);

 	clock_t t;

 	printf ("Begin clock...\n");

 

 	t = clock();//第一個clock() t表示從程式啟動到現在這個時刻的時間

	CreateCircle(1000000,50,25);

 	t = clock() - t;//第二次呼叫clock()減去第一次獲得的t的差值為兩次掐表的間隔

	printf ("\nIt took %d clicks (%f seconds) to test.\n",t,((float)t)/CLOCKS_PER_SEC);

 	return 0;

}

int IsPointInCircle(int px,int py,int x,int y,int r)

 {

	 double distance = sqrt(pow(py-y,2)+pow(px-x,2));
	
 	if(distance -r >0.00001) //減去double型別的誤差 再比較大小

		return 0; //返回0 便是不在圓內

	else

	 return 1; //返回1 在圓內

}

int CreateCircle(int n,int px,int py)

{

 	int r ; //r用來緩衝臨時產生圓圈的半徑

	int x; //x用來緩衝臨時產生圓圈的圓心橫座標

	int y; //y用來緩衝臨時產生圓圈的圓心縱座標

	int iCount = 0; //計數產生圓圈的個數

	srand(time(NULL)); //初始化隨即種子

	while(iCount < n)

 	{

 	x = rand()%1000; // rand()函式就是返回一個隨機數

	y = rand()%1000;

 	r = rand()%100;

 	if(IsPointInCircle(px,py,x,y,r)) //如果在圓內

  		 printf("%din",iCount); //列印出他在圓內
	
   	++iCount;

 	}

}

3.在各個平臺的執行的情況

    在RHEL7上

在REHL6上

在Solaris11上

在MAC上

相關文章