《C编程.中级C》7.进一步教学

<math.h>头包含了与数学打交道的几个函数的原型。在ISO标准的1990版本中,仅double指定了函数的版本; 1999版增加了floatlong double版本。要使用这些数学函数,必须将程序与数学库链接。对于某些编译器(包括GCC),必须指定附加参数-lm[1] [2]

数学函数可能会产生两种错误之一。当函数的参数无效时会发生域错误,例如负数作为sqrt的参数(平方根函数)。如果函数的结果不能以特定的浮点类型表示,则会发生范围错误,例如pow(1000.0,1000.0),如果double的最大值大约为10 308

这些功能可以分为以下几类:

三角函数

acosasin功能

acos函数返回其参数的反余弦弧度,和asin函数返回其参数的反正弦弧度。所有函数都期望参数在[-1,+ 1]范围内。反余弦返回[0,π]范围内的值; arcsine返回[-π/ 2,+π/ 2]范围内的值。

 #include  <math.h>
 float  asinf (float  x );  / * C99 * / 
 float  acosf (float  x );  / * C99 * / 
 double  asin (double  x ); 
 双 acos (双 x ); 
 长 双 asinl (长 双 x );  / * C99 * / 
 长 双 acosl (长 双 x );  / * C99 * /

atanatan2功能

atan函数返回其参数的反正切弧度,和atan2函数返回的反正切y/x弧度。的atan功能的范围内返回一个值[-π/ 2,+π/ 2](之所以±π/ 2被包括在范围内是因为,浮点型值可以表示无穷大,ATAN(±∞)= ±π/ 2); 该atan2功能在范围[-π,+π]返回一个值。因为atan2,如果两个参数都为零,则可能会出现域错误。

 #include  <math.h>
 float  atanf (float  x );  / * C99 * / 
 float  atan2f (float  y , float  x );  / * C99 * / 
 double  atan (double  x ); 
 双 atan2 (双 y , 双 x ); 
 long  double  atanl (long  double  x );  / * C99 * / 
 长 双 atan2l (长 双 y , 长 双 x );  / * C99 * /

cossintan功能

cossintan函数返回余弦,正弦,和参数的正切,以弧度表示。

 #include  <math.h>
 float  cosf (float  x );  / * C99 * / 
 float  sinf (float  x );  / * C99 * / 
 float  tanf (float  x );  / * C99 * / 
 双 cos (双 x ); 
 双 罪(双 x ); 
 双 棕褐色(双 x ); 
 长 双 cosl (长 双 x );  / * C99 * / 
 long  double  sinl(长 双 x );  / * C99 * / 
 长 双 tanl (长 双 x );  / * C99 * /

双曲函数

的COSH,双曲正弦和双曲正切函数计算双曲余弦,双曲正弦,和分别自变量的双曲正切。对于双曲正弦和余弦函数,如果参数的幅度太大,则会发生范围错误。

所述ACOSH函数计算参数的反双曲余弦值。参数小于1时发生域错误。

所述ASINH函数计算参数的反双曲正弦。

所述ATANH函数计算参数的反双曲正切。如果参数不在区间[-1,+ 1]中,则会发生域错误。如果参数等于-1或+1,则可能发生范围错误。

 #include  <math.h>
 float  coshf (float  x );  / * C99 * / 
 float  sinhf (float  x );  / * C99 * / 
 float  tanhf (float  x );  / * C99 * / 
 double  cosh (double  x );  
 double  sinh (double  x ); 
 double  tanh (double  x ); 
 长 双 coshl (长 双 x );  / * C99 * / 
 长 双 sinhl(长 双 x );  / * C99 * / 
 长 双 tanhl (长 双 x );  / * C99 * / 
 float  acoshf (float  x );  / * C99 * / 
 float  asinhf (float  x );  / * C99 * / 
 float  atanhf (float  x );  / * C99 * / 
 双 acosh (双 x );  / * C99 * / 
 double  asinh (double  x );  / * C99 * /
 双 atanh (双 x );  / * C99 * / 
 long  double  acoshl (long  double  x );  / * C99 * / 
 long  double  asinhl (long  double  x );  / * C99 * / 
 long  double  atanhl (long  double  x );  / * C99 * /

指数和对数函数

expexp2expm1功能

exp函数计算碱基Ë的指数函数xË X)。如果幅度x太大,则会发生范围错误。

exp2函数计算的基数为2的指数函数x(2 X)。如果幅度x太大,则会发生范围错误。

expm1函数计算碱基Ë参数的指数函数,如果减去的大小发生1.一种范围误差x过大。

 #include  <math.h>
 float  expf (float  x );  / * C99 * / 
 double  exp (double  x ); 
 长 双 爆(长 双 x );  / * C99 * / 
 float  exp2f (float  x );  / * C99 * / 
 double  exp2 (double  x );  / * C99 * / 
 long  double  exp2l (long  double  x );  / * C99 * / 
 float  expm1f (float  x);  / * C99 * / 
 double  expm1 (double  x );  / * C99 * / 
 long  double  expm1l (long  double  x );  / * C99 * /

frexpldexpmodfscalbn,和scalbln功能

这些函数在软件浮点仿真器中大量使用,但很少直接调用。

在计算机内部,每个浮点数由两部分表示:

  • 有效数位于[1/2,1]范围内,或者等于零。
  • 指数是一个整数。
v
v = {{\ rm {significand}}} \ times 2 ^ {{{\ rm {exponent}}}}

浮点数的值 {\ displaystyle v} 是 {\ displaystyle v = {\ rm {significand}} \ times 2 ^ {\ rm {exponent}}}。

这些frexp函数将参数浮点数分解为value指数和有效数这两部分。将它拆开后,它将指数存储在int指向的对象中ex,并返回有效数。换句话说,返回的值是给定浮点数的副本,但指数替换为0.如果value为零,则结果的两个部分都为零。

ldexp功能由2的整数幂乘一个浮点数并返回结果。换句话说,它返回给定浮点数的副本,指数增加了ex。可能会出现范围错误。

这些modf函数将参数value分解为整数和小数部分,每个部分都与参数具有相同的符号。它们将整数部分存储在指向的对象中*iptr并返回分数部分。它*iptr是一个浮点类型,而不是“int”类型,因为它可能用于存储一个像1 000 000 000 000 000 000 000这样的整数,这个整数太大而不适合int。

scalbnscalbln计算x× 。是浮点系统的基础; 如果它是2,则函数相当于。 FLT_RADIXnFLT_RADIXldexp

 #include  <math.h>
 float  frexpf (float  value , int  * ex );  / * C99 * / 
 double  frexp (double  value , int  * ex ); 
 long  double  frexpl (long  double  value , int  * ex );  / * C99 * / 
 float  ldexpf (float  x , int  ex );  / * C99 * / 
 double  ldexp (double  x , int  ex); 
 long  double  ldexpl (long  double  x , int  ex );  / * C99 * / 
 float  modff (float  value , float  * iptr );  / * C99 * / 
 double  modf (double  value , double  * iptr );  
 long  double  modfl (long  double  value , long  double  * iptr );  / * C99 * / 
 float  scalbnf (float  x , int  ex );  / * C99 * / 
 double  scalbn (double  x , int  ex );  / * C99 * / 
 long  double  scalbnl (long  double  x , int  ex );  / * C99 * / 
 float  scalblnf (float  x , long  int  ex );  / * C99 * / 
 double  scalbln (double  x , long  int  ex );  / * C99 * /
 long  double  scalblnl (long  double  x , long  int  ex );  / * C99 * /

大多数C浮点库还实现了IEEE754推荐的nextafter(),nextUp()和nextDown()函数。

loglog2log1p,和log10功能

log函数计算碱基ë自然(常见)参数的对数,并返回结果。如果参数为负,则会发生域错误。如果参数为零,则可能发生范围错误。

log1p函数计算碱基ë自然(常见)一个加参数的对数,并返回结果。如果参数小于-1,则会发生域错误。如果参数为-1,则可能发生范围错误。

log10函数计算参数的共同(基-10)对数并返回结果。如果参数为负,则会发生域错误。如果参数为零,则可能发生范围错误。

log2函数计算参数的基本对数2并返回结果。如果参数为负,则会发生域错误。如果参数为零,则可能发生范围错误。

 #include  <math.h>
 float  logf (float  x );  / * C99 * / 
 double  log (double  x ); 
 long  double  logl (long  double  x );  / * C99 * / 
 float  log1pf (float  x );  / * C99 * / 
 double  log1p (double  x );  / * C99 * / 
 long  double  log1pl (long  double  x );  / * C99 * / 
 float  log10f (float  x);  / * C99 * / 
 double  log10 (double  x ); 
 long  double  log10l (long  double  x );  / * C99 * / 
 float  log2f (float  x );  / * C99 * / 
 double  log2 (double  x );  / * C99 * / 
 long  double  log2l (long  double  x );  / * C99 * /

ilogblogb功能

这些ilogb函数将指数提取x为signed int值。如果x为零,则返回值FP_ILOGB0; 如果x是无限的,他们会返回值INT_MAX; 如果x不是数字则返回值FP_ILOGBNAN; 否则,它们相当于调用相应的logb函数并将返回的值转换为type int。如果x为零,则可能发生范围错误。FP_ILOGB0并且FP_ILOGBNAN是定义的宏math.hINT_MAX是一个定义的宏limits.h

这些logb函数x以浮点格式提取指数为有符号整数值。如果x是低于正常的,则将其视为标准化; 因此,对于正有限x,1≤ x× < 。是标题中定义的浮点数的基数。 FLT_RADIX-logb(x)FLT_RADIXFLT_RADIXfloat.h

 #include  <math.h>
 int  ilogbf (float  x );  / * C99 * / 
 int  ilogb (double  x );  / * C99 * / 
 int  ilogbl (long  double  x );  / * C99 * / 
 float  logbf (float  x );  / * C99 * / 
 double  logb (double  x );  / * C99 * / 
 long  double  logbl (long  double  x );  / * C99 * /

电源功能

pow功能

pow函数计算x幂,y并返回结果。如果x为负且y不是整数值,则会发生域错误。如果在x零为零且y小于或等于零时无法表示结果,则会发生域错误。可能会出现范围错误。

 #include  <math.h>
 float  powf (float  x , float  y );  / * C99 * / 
 双 POW (双 X , 双 ÿ ); 
 long  double  powl (长 双 x , 长 双 y );  / * C99 * /

sqrt功能

sqrt函数计算的正平方根x,并返回结果。如果参数为负,则会发生域错误。

 #include  <math.h>
 float  sqrtf (float  x );  / * C99 * / 
 double  sqrt (double  x ); 
 long  double  sqrtl (long  double  x );  / * C99 * /

cbrt功能

cbrt函数计算的立方根x并返回结果。

 #include  <math.h>
 float  cbrtf (float  x );  / * C99 * / 
 double  cbrt (double  x );  / * C99 * / 
 long  double  cbrtl (long  double  x );  / * C99 * /

hypot功能

hypot函数计算的平方和的平方根xy,没有上溢或下溢,并返回结果。

 #include  <math.h>
 float  hypotf (float  x , float  y );  / * C99 * / 
 双 hypot将(双 X , 双 ÿ );  / * C99 * / 
 长 双 长皮(长 双 x , 长 双 y );  / * C99 * /

最近的整数,绝对值和余数函数

ceilfloor功能

ceil函数计算最小的积分值不小于x并返回结果; 该floor函数计算不大于最大积分值x,并返回结果。

 #include  <math.h>
 float  ceilf (float  x );  / * C99 * / 
 double  ceil (double  x ); 
 长 双层 毛巾(长 双 x );  / * C99 * / 
 float  floorf (float  x );  / * C99 * / 
 双 地板(双 X ); 
 长 双 floorl (长 双 X );  / * C99 * /

fabs功能

这些fabs函数计算浮点数的绝对值x并返回结果。

 #include  <math.h>
 float  fabsf (float  x );  / * C99 * / 
 double  fabs (double  x );  
 long  double  fabsl (long  double  x );  / * C99 * /

fmod功能

fmod函数计算的浮点余x/y,并返回值x–  * y,对于某些整数,使得如果y不为零,则结果具有相同的符号x和幅度小于的幅度y。如果y为零,则是否发生域错误或fmod函数返回零是实现定义的。

 #include  <math.h>
 float  fmodf (float  x , float  y );  / * C99 * / 
 double  fmod (double  x , double  y ); 
 long  double  fmodl (long  double  x , long  double  y );  / * C99 * /

nearbyintrintlrint,和llrint功能

这些nearbyint函数使用当前的舍入方向将它们的参数四舍五入为浮点格式的整数值,而不会引发“不精确”的浮点异常。

这些rint函数与函数类似,nearbyint只是如果结果与参数的值不同,它们可以引发“不精确”的浮点异常。

lrintllrint根据当前的舍入方向函数的循环它们的参数为最接近的整数值。如果结果超出返回类型的值范围,则数值结果未定义,并且如果参数的大小太大,则可能发生范围错误。

 #include  <math.h>
 float  nearbyintf (float  x );  / * C99 * / 
 double  nearbyint (double  x );  / * C99 * / 
 long  double  nearbyintl (long  double  x );  / * C99 * / 
 float  rintf (float  x );  / * C99 * / 
 双 rint (双 x );  / * C99 * / 
 long  double  rintl (long  double  x );  / * C99 * / 
 long  int  lrintf(浮动 x );  / * C99 * / 
 long  int  lrint (double  x );  / * C99 * / 
 long  int  lrintl (long  double  x );  / * C99 * / 
 long  long  int  llrintf (float  x );  / * C99 * / 
 long  long  int  llrint (double  x );  / * C99 * / 
 long  long  int  llrintl (long  double  x );  / * C99 * /

roundlroundllround功能

round轮的参数在浮点格式的最接近的整数值的功能,舍入半例远离零,而不考虑当前的舍入方向的。

lroundllround函数的循环参数为最接近的整数的值,舍入半例远离零,而不考虑当前的舍入方向的。如果结果超出返回类型的值范围,则数值结果未定义,并且如果参数的大小太大,则可能发生范围错误。

 #include  <math.h>
 float  roundf (float  x );  / * C99 * / 
 双 圆(双 X );  / * C99 * / 
 long  double  roundl (long  double  x );  / * C99 * / 
 long  int  lroundf (float  x );  / * C99 * / 
 long  int  lround (double  x );  / * C99 * / 
 long  int  lroundl (long  double  x );  / * * C99 / 
 长 很长 int  llroundf (float  x );  / * C99 * / 
 long  long  int  llround (double  x );  / * C99 * / 
 long  long  int  llroundl (long  double  x );  / * C99 * /

trunc功能

trunc函数的循环其参数在浮点格式的整数值最接近但在幅度上大于该参数没有大。

 #include  <math.h>
 float  truncf (float  x );  / * C99 * / 
 double  trunc (double  x );  / * C99 * / 
 long  double  truncl (long  double  x );  / * C99 * /

remainder功能

这些remainder函数计算IEC 60559定义的余数xREM y。定义为:“当y ≠0时,无论舍入模式如何,通过数学简化r = x – ny定义余数r = x REM y,其中n是最接近x / y精确值的整数;只要| n – x / y | =½,则n是偶数。因此,余数总是精确的。如果r = 0,则其符号应为x的符号“这个定义适用于所有实现。

 #include  <math.h>
 float  remainderf (float  x , float  y );  / * C99 * / 
 双 余数(双 x , 双 y );  / * C99 * / 
 long  double  remainderl (long  double  x , long  double  y );  / * C99 * /

remquo功能

remquo函数返回相同的其余部分的remainder功能。在所指向的对象中quo,它们存储一个值,其符号为x/ 的符号,y其大小与/ 的整数商的大小一致2 n,其中n是大于或等于3的实现定义的整数。 xy

 #include  <math.h>
 float  remquof (float  x , float  y , int  * quo );  / * C99 * / 
 double  remquo (double  x , double  y , int  * quo );  / * C99 * / 
 long  double  remquol (long  double  x , long  double  y , int  * quo );  / * C99 * /

错误和伽玛函数

{\ frac {2} {{\ sqrt {\ pi}}}} \ int _ {{0}} ^ {x} e ^ {{ -  t ^ {2}}} \,{\ mathrm d} t

erf函数计算参数的误差函数{\ displaystyle {\ frac {2} {\ sqrt {\ pi}}} \ int _ {0} ^ {x} e ^ { – t ^ {2}} \,\ mathrm {d} t}; 的erfc函数计算参数的互补误差函数(即,1 – ERF X)。对于erfc函数,如果参数太大,则可能发生范围错误。

lgamma函数计算参数的伽玛的绝对值的自然对数(即,日志Ë |Γ(X)|)。如果参数是负整数或零,则可能发生范围错误。

tgamma函数计算参数的伽马(即,Γ(x)的)。如果参数是负整数,或者如果参数为零时无法表示结果,则会发生域错误。可能会出现范围错误。

 #include  <math.h>
 float  erff (float  x );  / * C99 * / 
 double  erf (double  x );  / * C99 * / 
 长 双 erfl (长 双 x );  / * C99 * / 
 float  erfcf (float  x );  / * C99 * / 
 double  erfc (double  x );  / * C99 * / 
 long  double  erfcl (long  double  x );  / * C99 * / 
 float  lgammaf (float x );  / * C99 * / 
 double  lgamma (double  x );  / * C99 * / 
 long  double  lgammal (long  double  x );  / * C99 * / 
 float  tgammaf (float  x );  / * C99 * / 
 double  tgamma (double  x );  / * C99 * / 
 long  double  tgammal (long  double  x );  / * C99 * /

猜你想读:《C编程.中级C》8.库

THE END
分享