C Primer Plus学习 五十五 数学库

       数学库包含许多有用的数学函数。头文件math.h提供这些函数的函数声明或原型。表16.4列举了-些 math.h中声明的函数。注意角度的单位为弧度(1弧度=l80/3.14=57.296度)。


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

magnitude = square root (x2 + y2) angle = arctangent (y/x)

        数学库提供了平方根函数和一对反正切函数。因此,可以用c程序解决这个问题。平方根函数S£Jrt() 接受一个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工具。

/* rect_pol.c --把直角坐标转换为极坐标*/

#include<stdio.h>

#include<math.h>



#define RAD_TO_DEG (180/(4*atan(1)))



typedef struct polar_v{

double magnitude;

double angle;

}POLAR_V;

typedef struct rect_v{

double y;

double x;

}RECT_V;



POLAR_V rect_to_polar(RECT_V);



int main(void)

{

RECT_V input;

POLAR_V result;

puts("Enter x,y coordinates:Enter q to quit:");

while(scanf("%lf %lf",&input.x,&input.y)==2)

{

result=rect_to_polar(input);

printf("magnitude=%.2f. angle=%.2f\n",result.magnitude,result.angle);

}

puts("Bye.");

return 0;

}

POLAR_V rect_to_polar(RECT_V rv){

POLAR_V pv;

pv.magnitude=sqrt(rv.x*rv.x+rv.y*rv.y);

if(pv.magnitude==0)

pv.angle=0.0;

else

pv.angle=RAD_TO_DEG*atan2(rv.y,rv.x);

return pv;

}

下面是一个运行示例:
Enter x, y coordinates; enter q to quit:
10 10
• magnitude = 14.14, angle = 45.00 -12-5
magnitude = 13.00t angle = -157.38
q
Bye.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值