数值精度问题,求教
c语言吧
全部回复
仅看楼主
level 3
#include<stdio.h>#
define pi 3.141592653int main(){int a1,a2;double a3,ra,q;q=41.40;a1=(int)q;a2=(int)(100*(q-a1));a3=100*(100*(q-a1)-a2);ra=(a1+a2/60.0+a3/3600.0)*pi/180;printf("%d %d %lf",a1,a2,a3);return 0;}
输入的是41.40,为什么输出的是41,39 ,100
2012年04月23日 13点04分 1
level 5
太乱了太乱了
2012年04月23日 14点04分 2
level 3
#include<stdio.h>
#define pi 3.141592653
int main(){int a1,a2;
double a3,ra,q;
q=41.40;
a1=(int)q;
a2=(int)(100*(q-a1));
a3=100*(100*(q-a1)-a2);
printf("%d %d %lf\n",a1,a2,a3);
return 0;}
2012年04月23日 14点04分 3
level 3
存储的时候数值改变了,把double类型换成float之后a2正确,但是a3会出问题
2012年04月23日 14点04分 4
level 5
改一下%lf试试
2012年04月23日 14点04分 5
level 3
在调试过程中a1=(int)q;里面的q的值显示的就是41.3999999999
2012年04月23日 14点04分 6
level 3
加类型是什么意思?是指强制转换使用的int吗?
2012年04月24日 01点04分 8
level 9
41.400000 %f打印、、、
2012年04月24日 01点04分 10
level 3
输出的时候的确还是41.40,但是a2输出的值是39,a3输出的值是100.000
2012年04月24日 01点04分 11
level 7
你用float就可以明显看出了知道了。。
float使用6位精度。41.40实际存储是41.3999996185,float取六位小数点后就是41.399999,所以a1为41,a2为39,a3就是99.6185。同理你用精度为double,就保证至少13位精度。这时你用 100乘肯定是100,你可以用 a3 = pow(10,15)*(100 * (q-a1) -a2)试试结果,应该为99...多少。

2012年04月24日 01点04分 12
level 3
a1本来就是整形,那个int加不加无所谓的,只是一个警告,不会报错,也没有影响的,系统默认强制转换为int类型
2012年04月24日 01点04分 13
level 3
这个怎么样存储才能保证在计算过程中不会因为存储精度问题影响最后结果啊?
2012年04月24日 01点04分 14
level 7
小数点后用至少同等精度的参数赋值
2012年04月24日 01点04分 15
level 3
在后面加足够的0?
2012年04月24日 02点04分 16
level 7
b用浮点型。
2012年04月24日 04点04分 17
1