16.9 数学库

数学库包含许多有用的数学函数。头文件math.h提供这些函数的函数声明或原型。表16.4列举了一些math.h中声明的函数。注意角度的单位为弧度(1弧度=180/π=57.296度)(参考资料5“添加了C99的标准ANSI C库”提供了C99标准指定的函数的完整列表)。

表16.4 ANSI C标准数学函数原型描述

 

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

 

原型 描述
double acos (double x) 返回余弦值为x的角度值(0到π弧度)
double asin (double x) 返回正弦值为x的角度值(-π/2到π/2弧度)
double atan (double x) 返回正切值为x的角度值(-π/2到π/2弧度)
double atan2 (double y, double x) 返回正切值为y/x的角度值(-π到π弧度)
double cos (double x) 返回x的余弦值,x单位为弧度
double sin (double x) 返回x的正弦值,x单位为弧度
double tan (double x) 返回x的正切值,x单位为弧度
double exp (double x) 返回x的指数函数的值(e的x次方)
double log (double x) 返回x的自然对数值
double log10 (double x) 返回x的以10为底的对数值
double pow (double x, double y) 返回x的y次幂的值
double sqrt (double x) 返回x的平方根
double ceil (double x) 返回不小于x的最小整数值
double fabs (double x) 返回x的绝对值
double floor (double x) 返回不大于x的最大整数值

我们用数学库来解决一个常见问题:把x/y坐标转换为长度和角度。例如,在栅格上画了一条线,该线条水平穿过4个单元(x的值),垂直穿过3个单元(y的值)。那么,该线的长度(或称大小,magnitude)和方向如何呢?从三角知识可得到下面两个式子:

阅读 ‧ 电子书库

数学库提供了平方根函数和一对反正切函数。因此,可以用C程序解决这个问题。平方根函数sqrt()接受一个double参数并返回该参数的平方根,返回值类型也是double。

函数atan()接受一个double参数(正切值),并返回角度值(该角度的正切值等于参数值)。但是,当线条的x和y值均为-5时,atan()函数会产生混淆。因为(-5)/(-5)等于1,所以atan()返回45。该值与x和y均为5时的返回值相同。换句话说,atan()不能区分角度相同但方向相反的线(实际上,atan()返回弧度,而非度;我们很快将讨论两者的转换)。

幸运的是,C库还提供atan2()函数。它接受两个参数:x的值和y的值。这样,通过检查x和y的符号就可得出正确的角度值。atan2()和atan()均返回弧度值。要将弧度转化为度,只需将弧度值乘以180,再除以pi。pi的值可通过计算表达式4*atan(1)得到。程序清单16.13说明了这些步骤。另外,学习该程序清单还能复习结构和typedef工具。

程序清单 16.13 rect_pol.c程序

阅读 ‧ 电子书库

阅读 ‧ 电子书库

下面是一个运行示例:

阅读 ‧ 电子书库

如果在编译时得到类似下面的消息:

阅读 ‧ 电子书库

或:

阅读 ‧ 电子书库

或其他类似消息,这表明编译器的链接器没有找到数学库。UNIX系统要求使用-lm标记以指示连接器搜索数学库:

阅读 ‧ 电子书库

Linux的gnu编译器也使用相同的形式:

阅读 ‧ 电子书库