C语言程序,结果会出现负0,请问怎么办?

这个程序用来输出向量(a,b)逆时针旋转一个角(jiaodu)后的坐标;
但是有输入 1 0 360 后输出 1.0000 -0.0000 的情况。求解~

#include<stdio.h>
#include<math.h>
int main()
{
double a,b,jiaodu,hudu,pai,c,d;
pai=3.14159;

scanf("%lf%lf%lf",&a,&b,&jiaodu);

hudu =pai*jiaodu/180;
c=a*cos(hudu)-b*sin(hudu);
d=a*sin(hudu)+b*cos(hudu);

printf("%.4lf %.4lf",c,d);
return 0;}

这是圆周率数值的截断误差引起的,算出的向量就是接近0的负数。
要想得正0,圆周率给个 (四舍)五入值:
pai=3.14159265359;
就可以了。
但不能保证别的特殊的输入数会不会 该正0 出现负0。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-05
因为pai小于π,所以360度转换出来的弧度值小于2π,于是sin(hudu)变成了一个接近于0的负数。经测试,
c=0.99999999998591693
d=-5.3071795866867667e-006
所以取四位小数时,
c=1.0000
d=-0.0000
对无理数,电脑是近似运算,这应该没什么关系。如果你一定要去掉这个负号,就先将d的与一个足够小的数比较,如果小于这个数,就认为d是0,然后把0赋给d就是了。本回答被提问者采纳
第2个回答  2012-11-06
首先,恭喜你,你的程序是没有错误的。
之所以出现负0,是因为最后结果本身是一个很小的负数,截取后变成了运行结果那个样子。
产生这个错误(准确应该叫做误差)的原因是pai并不是准确的3,.14159 ,也就是你取的是一个估计值,也就导致了那么的误差出现。
本人认为你可以通过加强pai的精度来尽量避免此问题,彼如定义 pai=3.1415926(已经通过验证成功),甚至更多位。
希望可以帮到你。
第3个回答  2012-11-05
本身是个负数由于你去的有效位的问题 只截取的那部分所以变成那样了追问

请问如何修改呢?谢谢~

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网