|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<stdio.h>
int main()
{
int a,c;
double b;
printf("请输入两个手济号:\n");
scanf("%d %f",&a,&b);
printf("两号之和为 %d ",a+b);
return 0;
}
输入18812345678 和15687654321
结果为1400897536
原因!
原因有很多:%d溢出问题导致的数据损失,%f存储精度损失,%d转为%f是的转换精度损失,大数和小数相加的精度损失
18812345678存放到%d中得到的是1632476494,这是溢出导致的精度损失。18812345678转为16进制结果如下:4614D9D4E,因超过了32位,会被截断,剩下614D9D4E,结果就是1632476494
15687654321以%f存储,会有精度损失,有效位数只有8位,得到的结果是15687654400,前8位是精确的,后三位是不精确的。
a+b的时候是浮点数与整型数相加,会先将整型数转为浮点数,1632476494转为浮点数有精度损失,得到的是1632476544
还有两个浮点数阶码不一样,相加减的时候会先进行对阶,转为相同的阶码,再运算。这里也会有精度损失。
这就导致了最后的结果有很大的差异,我这里得到的是:1350634375
注意:红色标出的部分,在不同的电脑上结果会不一样,甚至每次运行可能都不一样。
|
|