C语言的数学计算库

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);

其中sincostan函数的输入参数都是以弧度表示的,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;
}

数学计算库

参考文献

  1. K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社
  • 2
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值