C语言提供了一个支持数学运算的丰富的函数库,包括三角函数、双曲函数、指数和对数函数、幂函数、就近取整函数、绝对值函数和取余函数。这些函数的原型都定义在头文件<math.h>
中。使用它们,需要用#include
指令包含这个头文件。在利用gcc
编译时,需要手动链接数学计算库,即在生成目标后添加-L. -lm
选项,其形式为:
gcc -o 目标名 ... _L -lm
<math.h>
中的函数可能会产生两类错误,一类是定义域错误,即函数的实参超过了函数的定义域,一类是取值范围错误,即函数的返回值超出了double类型的值范围。<math.h>
中的函数的错误处理方式与其他库函数不同,当出现定义域错误时,将EDOM
存储到在头文件<errno.h>
声明的名字为errno
的特定变量中,返回值由实现决定(有的返回NAN
),当出现取值范围错误时,如果是过大,将ERANGE
存储到errno
中,返回正的或负的HUGE_VAL
值(该宏在<math.h>
中定义,如果过小,有些实现也将ERANGE
存入errno
,并返回0
.
三角函数
三角函数包括求正弦、余弦、正切、反正弦、反余弦、反正切函数,其函数原型如下:
double sin(double x);
double cos(double x);
double tan(double x);
double asin(double x);
double acos(double x);
double atan(double x);
double atan2(double y, double x);
其中sin
、cos
和tan
函数的输入参数都是以弧度表示的,atan2
函数是求y/x
的反正切值。
双曲函数
双曲函数包括双曲余弦函数、双曲正弦函数和双曲正切函数,其函数原型分别为:
double cosh(double x);
double sinh(double x);
double tanh(double x);
三个函数的参数是以弧度为单位的。
指数函数和对数函数
指数函数和对数函数的原型为:
double exp(double x);
double log(double x);
double log10(double x);
log
是求以e
为底的对数,log10
是求以10
为底的对数。除了以上直接求指数和对数的函数外,还提供了其他三个函数,其中frexp
将一个double
类型的值拆分为小数和指数两部分,函数返回小数部分,并将指数部分通过其第二个参数返回,其原型为:
double frexp(double value, int *exp);
ldexp
函数相反,将小数和指数部分组合为一个doubl e
类型的数,其原型为:
double ldexp(double x, int exp);
还有一个函数modf将一个double类型拆分为整数和小数部分,小数部分返回,正数部分通过第二个参数返回,其原型为:
double modf(double value, double *iptr);
幂函数
幂函数包括一下两种:
double pow(double x, double y);
double sqrt(double x);
pow
用以计算x的y次幂,sqrt
计算x的平方根。
就近取整函数、绝对值函数和取余函数
就近取整函数ceil、floor,绝对值函数fabs和取余函数fmod的原型为:
double ceil(double x);
double fabs(double x);
double floor(double x);
double fmod(double x, double y);
ceil
函数计算的是大于或等于x的最小整数,floor
函数计算的是小于或等于x的最大整数。fabs
计算x的绝对值,fmod
计算x除以y所得的余数。
/**************************************
* using_math_function.c *
* *
* 使用C语言中的数学计算库函数 *
**************************************/
#include <stdio.h>
#include <math.h>
#include <errno.h>
#define PI 3.1415926
int main()
{
/*三角函数*/
printf("sin(PI/2) = %g\n", sin(PI/2));
printf("cos(PI/2) = %g\n", cos(PI/2));
printf("tan(PI/2) = %g\n", tan(PI/2));
if (errno == ERANGE)
printf("tan(PI/2)出现取值范围错误!\n");
printf("tan(PI/4) = %g\n", tan(PI/4));
printf("asin(1.0) = %g\n", asin(1.0));
printf("acos(1.0) = %g\n", acos(1.0));
printf("atan(1.0) = %g\n", atan(1.0));
printf("atan2(5.0,5.0) = %g\n", atan2(5.0, 5.0));
/*双曲函数*/
printf("cosh(PI/4) = %g\n", cosh(PI/4));
printf("sinh(PI/4) = %g\n", sinh(PI/4));
printf("tanh(PI/4) = %g\n", tanh(PI/4));
/*指数和对数函数*/
double temp = exp(5.2);
printf("exp(5.2) = %g\n", temp);
printf("log(temp) = %g\n", log(temp));
printf("log10(1000) = %g\n", log10(1000));
temp = 12.34;
int iExp = 0;
double fraction = 0.0;
fraction = frexp(temp, &iExp);
printf("%g的小数部分%g,指数部分%d\n", temp, fraction, iExp);
temp = ldexp(fraction, iExp);
printf("小数部分%g,指数部分%d组合为%g\n", fraction, iExp, temp);
double intPart = 0.0;
fraction = modf(temp, &intPart);
printf("%g的整数部分为%g,小数部分为%g\n", temp, intPart, fraction);
/*幂函数*/
printf("pow(10.0, 2) = %g\n", pow(10.0, 2));
printf("sqrt(16.0) = %g\n", sqrt(16.0));
/*就近取整函数、绝对值函数和取余函数*/
printf("ceil(12.34) = %g\n", ceil(12.34));
printf("floor(12.34) = %g\n", floor(12.34));
printf("fabs(-12.34) = %g\n", fabs(-12.34));
printf("fmod(5.5, 2.2) = %g\n", fmod(5.5, 2.2));
return 0;
}
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社