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

#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

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不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-05

float类型数据只有前6位是精确的,从第七位开始都是由“四舍五入”获得的。

两个printf()函数的输出结果的差异发生在第十位,所以说,这两组数据都是“对”的。

下面把float改为double(当然输出格式也做了相应的修改),两组输出结果是相同的,原因在于,double类型数据的前16位是精确的。

/*

a = 12345678900.000000 b = 12345678920.000000

a = 12345678900.000000 b = 12345678920.000000

Press any key to continue

*/

#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;
}

本回答被提问者采纳
第2个回答  2014-02-05
精度的问题
可以详细去了解下 float和double 小数点前及小数点后在内存的存放方式及
float是32位的 double 是64位的
上面的结果应该是超出了float的精度范围追问

两次结果为什么不一样呢

追答

简单说就是你的数值输出结果要求已经超出你的float有效值了 任何数据类型都不能存储超过这个类型本身能表达的数字 float是32bit的类型 32位的数据最大只能表达0~4294967295(无符号型)的数字范围 你上面的赋值已经是百亿级别了 float有保留了小数位 剩下的就放你的整数位数据 超出了它所能表达的范围就把高位数保留了,低位数(如个位、十位、百位数)则丢弃 printf的时候后面舍弃的低位数无法获知(保存到内存时丢弃了)那么就是随机的了(说是随机其实和在寄存器内的运算有关)

第3个回答  2014-02-05
你试着用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);
相似回答