该<math.h>
头包含了与数学打交道的几个函数的原型。在ISO标准的1990版本中,仅double
指定了函数的版本; 1999版增加了float
和long double
版本。要使用这些数学函数,必须将程序与数学库链接。对于某些编译器(包括GCC),必须指定附加参数-lm
[1] [2]。
数学函数可能会产生两种错误之一。当函数的参数无效时会发生域错误,例如负数作为sqrt的参数(平方根函数)。如果函数的结果不能以特定的浮点类型表示,则会发生范围错误,例如pow(1000.0,1000.0),如果double的最大值大约为10 308。
这些功能可以分为以下几类:
三角函数
acos
和asin
功能
该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 * /
atan
和atan2
功能
该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 * /
cos
,sin
和tan
功能
的cos
,sin
和tan
函数返回余弦,正弦,和参数的正切,以弧度表示。
#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 * /
指数和对数函数
exp
,exp2
和expm1
功能
的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 * /
frexp
,ldexp
,modf
,scalbn
,和scalbln
功能
这些函数在软件浮点仿真器中大量使用,但很少直接调用。
在计算机内部,每个浮点数由两部分表示:
- 有效数位于[1/2,1]范围内,或者等于零。
- 指数是一个整数。
浮点数的值 {\ 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。
该scalbn
和scalbln
计算x
× 。是浮点系统的基础; 如果它是2,则函数相当于。 FLT_RADIXn
FLT_RADIX
ldexp
#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()函数。
log
,log2
,log1p
,和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 * /
ilogb
和logb
功能
这些ilogb
函数将指数提取x
为signed int值。如果x
为零,则返回值FP_ILOGB0
; 如果x
是无限的,他们会返回值INT_MAX
; 如果x
不是数字则返回值FP_ILOGBNAN
; 否则,它们相当于调用相应的logb
函数并将返回的值转换为type int
。如果x
为零,则可能发生范围错误。FP_ILOGB0
并且FP_ILOGBNAN
是定义的宏math.h
; INT_MAX
是一个定义的宏limits.h
。
这些logb
函数x
以浮点格式提取指数为有符号整数值。如果x
是低于正常的,则将其视为标准化; 因此,对于正有限x
,1≤ x
× < 。是标题中定义的浮点数的基数。 FLT_RADIX-logb(x)
FLT_RADIX
FLT_RADIX
float.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
函数计算的平方和的平方根x
和y
,没有上溢或下溢,并返回结果。
#include <math.h> float hypotf (float x , float y ); / * C99 * / 双 hypot将(双 X , 双 ÿ ); / * C99 * / 长 双 长皮(长 双 x , 长 双 y ); / * C99 * /
最近的整数,绝对值和余数函数
ceil
和floor
功能
该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 * /
nearbyint
,rint
,lrint
,和llrint
功能
这些nearbyint
函数使用当前的舍入方向将它们的参数四舍五入为浮点格式的整数值,而不会引发“不精确”的浮点异常。
这些rint
函数与函数类似,nearbyint
只是如果结果与参数的值不同,它们可以引发“不精确”的浮点异常。
的lrint
和llrint
根据当前的舍入方向函数的循环它们的参数为最接近的整数值。如果结果超出返回类型的值范围,则数值结果未定义,并且如果参数的大小太大,则可能发生范围错误。
#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 * /
round
,lround
和llround
功能
该round
轮的参数在浮点格式的最接近的整数值的功能,舍入半例远离零,而不考虑当前的舍入方向的。
的lround
和llround
函数的循环参数为最接近的整数的值,舍入半例远离零,而不考虑当前的舍入方向的。如果结果超出返回类型的值范围,则数值结果未定义,并且如果参数的大小太大,则可能发生范围错误。
#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定义的余数x
REM 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的实现定义的整数。 x
y
#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 * /
错误和伽玛函数
该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.库