Standard C 之 math.h和float.h

對於C Standard Library 能夠參考:http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ 或者 http://www.cplusplus.com/reference/git

(一) <math.h>

經常使用函數:web

一、 三角函數
double sin(double);正弦
double cos(double);餘弦
double tan(double);正切
2 、反三角函數
double asin (double); 結果介於[-PI/2,PI/2]
double acos (double); 結果介於[0,PI]
double atan (double); 反正切(主值),結果介於[-PI/2,PI/2]
double atan2 (double,double); 反正切(整圓值),結果介於[-PI,PI]
3 、雙曲三角函數
double sinh (double);
double cosh (double);
double tanh (double);
4 、指數與對數
double frexp(double value,int *exp);這是一個將value值拆分紅小數部分f和(以2爲底的)指數部分exp,並返回小數部分f,即f*2^exp。其中f取值在0.5~1.0範圍或者0。
double ldexp(double x,int exp);這個函數恰好跟上面那個frexp函數功能相反,它的返回值是x*2^exp
double modf(double value,double *iptr);拆分value值,返回它的小數部分,iptr指向整數部分。
double log (double); 以e爲底的對數
double log10 (double);以10爲底的對數
double pow(double x,double y);計算以x爲底數的y次冪
float powf(float x,float y); 功能與pow一致,只是輸入與輸出皆爲浮點數
double exp (double);求取天然數e的冪
double sqrt (double);開平方
5 、取整
double ceil (double); 取上整,返回不比x小的最小整數
double floor (double); 取下整,返回不比x大的最大整數,即高斯函數[x]
6 、絕對值
int abs(int i); 求整型的絕對值
double fabs (double);求實型的絕對值
double cabs(struct complex znum);求複數的絕對值
7 、標準化浮點數
double frexp (double f,int *p); 標準化浮點數,f = x * 2^p,已知f求x,p (x介於[0.5,1])
double ldexp (double x,int p); 與frexp相反,已知x,p求f
8 、取整與取餘
double modf (double,double*); 將參數的整數部分經過指針回傳,返回小數部分
double fmod (double,double); 返回兩參數相除的餘數
9 、其餘
double hypot(double x,double y);已知直角三角形兩個直角邊長度,求斜邊長度
double ldexp(double x,int exponent);計算x*(2的exponent次冪)
double poly(double x,int degree,double coeffs []);計算多項式
int matherr(struct exception *e);數學錯誤計算處理程序
 
注意: 包括像abs, labs, div ldiv,這些看起來像是屬於math.h,實際也是在stdlib.h中聲明的,math.h中主要聲明的是一些和浮點實數相關的數學函數及一些宏,和整數類型相關的都在stdlib.h中聲明。這是C標準定義的,和系統無關。
 
對於math.h中的宏,有例以下:

<math.h>文件中已經定義了M_PI,以下所示,用戶能夠直接使用;ide

複製代碼
//math.h
........................
#if defined(_USE_MATH_DEFINES) && !defined(_MATH_DEFINES_DEFINED) #define _MATH_DEFINES_DEFINED /* Define _USE_MATH_DEFINES before including math.h to expose these macro * definitions for common math constants. These are placed under an #ifdef * since these commonly-defined names are not part of the C/C++ standards. */ /* Definitions of useful mathematical constants * M_E - e * M_LOG2E - log2(e) * M_LOG10E - log10(e) * M_LN2 - ln(2) * M_LN10 - ln(10) * M_PI - pi * M_PI_2 - pi/2 * M_PI_4 - pi/4 * M_1_PI - 1/pi * M_2_PI - 2/pi * M_2_SQRTPI - 2/sqrt(pi) * M_SQRT2 - sqrt(2) * M_SQRT1_2 - 1/sqrt(2) */ #define M_E 2.71828182845904523536 #define M_LOG2E 1.44269504088896340736 #define M_LOG10E 0.434294481903251827651 #define M_LN2 0.693147180559945309417 #define M_LN10 2.30258509299404568402 #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.785398163397448309616 #define M_1_PI 0.318309886183790671538 #define M_2_PI 0.636619772367581343076 #define M_2_SQRTPI 1.12837916709551257390 #define M_SQRT2 1.41421356237309504880 #define M_SQRT1_2 0.707106781186547524401 #endif /* _USE_MATH_DEFINES */
複製代碼

但必須在使用的文件中,函數

#include<math.h>以前,加入#define _USE_MATH_DEFINES,以下所示:ui

複製代碼
1 //------------------------------------------------------------------------------
2 //>>>
4 //使用math.h中定義M_PI的定義
5 #define _USE_MATH_DEFINES
6 #include <math.h>
7 const double Rad2Deg = (180.0/M_PI);
8 //<<<
9 //------------------------------------------------------------------------------
複製代碼

 

(二)<float.h>

因爲浮點數存在的精度偏差,形成浮點數與0比較的問題,通常定義其偏差值來解決。float.h中已經定義了float,double兩種浮點數的偏差值,用戶能夠直接使用。spa

複製代碼
//float.h

.....................

#define DBL_DIG         15                      /* # of decimal digits of precision */
#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define DBL_MANT_DIG    53                      /* # of bits in mantissa */
#define DBL_MAX         1.7976931348623158e+308 /* max value */
#define DBL_MAX_10_EXP  308                     /* max decimal exponent */
#define DBL_MAX_EXP     1024                    /* max binary exponent */
#define DBL_MIN         2.2250738585072014e-308 /* min positive value */
#define DBL_MIN_10_EXP  (-307)                  /* min decimal exponent */
#define DBL_MIN_EXP     (-1021)                 /* min binary exponent */
#define _DBL_RADIX      2                       /* exponent radix */
#define _DBL_ROUNDS     1                       /* addition rounding: near */

#define FLT_DIG         6                       /* # of decimal digits of precision */
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define FLT_GUARD       0
#define FLT_MANT_DIG    24                      /* # of bits in mantissa */
#define FLT_MAX         3.402823466e+38F        /* max value */
#define FLT_MAX_10_EXP  38                      /* max decimal exponent */
#define FLT_MAX_EXP     128                     /* max binary exponent */
#define FLT_MIN         1.175494351e-38F        /* min positive value */
#define FLT_MIN_10_EXP  (-37)                   /* min decimal exponent */
#define FLT_MIN_EXP     (-125)                  /* min binary exponent */
#define FLT_NORMALIZE   0
#define FLT_RADIX       2                       /* exponent radix */
#define FLT_ROUNDS      1                       /* addition rounding: near */
複製代碼

 

 應用舉例:指針

複製代碼
//------------------------------------------------------------------------------
//>>>
#include <float.h>
#define  FLOAT_EQ(a,b)  (fabs(a-b)<=FLT_EPSILON)
#define  DOUBLE_EQ(a,b)  (fabs(a-b)<=DBL_EPSILON)
//<<<
//------------------------------------------------------------------------------

float x,y;

x=0.0;

y=0.0000001;

if(fabs(a)<FLT_EPSILON)  //判斷單精度類型變量x是否爲零
......

if(fabls(a-b)<FLT_EPSILON) //判斷單精度變量x,y是否相等
......
複製代碼

 

 注意:對以上數學計算的宏定義,不要重複定義。code

相關文章
相關標籤/搜索