永发信息网

c语言中两句相同的printf为什么输出结果不同

答案:5  悬赏:70  手机版
解决时间 2021-03-09 01:23
  • 提问者网友:像風在裏
  • 2021-03-08 07:16
#include "stdAfx.h"

int main(int argc, char* argv[])
{

float a=123456.789e5, b;
b=a+20;
printf("a=%f b=%f\n",a,b);
printf("a=%f b=%f\n",a,b);
return 0;
}

为什么输出结果为 a=12345678848.000000,b=12345678868.000000
a=12345678848.000000,b=12345678848.000000
最佳答案
  • 五星知识达人网友:煞尾
  • 2021-03-08 08:53
float类型数据只有前6位是精确的,从第七位开始都是由“四舍五入”获得的。
两个printf()函数的输出结果的差异发生在第十位,所以说,这两组数据都是“对”的。
下面把float改为double(当然输出格式也做了相应的修改),两组输出结果是相同的,原因在于,double类型数据的前16位是精确的。


#include <stdio.h>

int main(int argc, char* argv[]) {
double a = 123456.789e5, b;
b = a + 20;
printf("a = %lf b = %lf\n",a,b);
printf("a = %lf b = %lf\n",a,b);
return 0;
}
全部回答
  • 1楼网友:雪起风沙痕
  • 2021-03-08 10:56
你试着用float型的函数定义a,b,这样的话结果应该是正确的,或者把 printf("a=%f b=%f\n",a,b); printf("a=%f b=%f\n",a,b); 改为 printf("a=%f b=%lf\n",a,b); printf("a=%f b=%lf\n",a,b);
  • 2楼网友:何以畏孤独
  • 2021-03-08 10:47
精度的问题 可以详细去了解下 float和double 小数点前及小数点后在内存的存放方式及 float是32位的 double 是64位的 上面的结果应该是超出了float的精度范围
  • 3楼网友:大漠
  • 2021-03-08 10:22

int a=7,b=2,m=0,n=0,k;

k=(n=b>a)||(m=a);

printf("%d,%d\n",k,m);

  • 4楼网友:骨子里都是戏
  • 2021-03-08 09:02
double、float都是浮点型。double(双精度型)比float(单精度型)存的数据更准确些,占的空间也更大。double精度是float的两倍,所以需要更精确的计算常使用double。超出精度的部分就随机了。。。。。 单精度浮点数在机内占4个字节,用32位二进制描述。 双精度浮点数在机内占8个字节,用64位二进制描述。 浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。 数符占1位二进制,表示数的正负。 指数符占1位二进制,表示指数的正负。 尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点 指数存指数的有效数字。 指数占多少位,尾数占多少位,由计算机系统决定。 可能是数符加尾数占24位,指数符加指数占8位 -- float. 数符加尾数占48位,指数符加指数占16位 -- double. 知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。 对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯