预计阅读本页时间:-
数学库包含许多有用的数学函数。头文件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编译器也使用相同的形式: