C语言, float double输出不一样,求大神
#include<stdio.h>main(){doublea=63.245;floatb=63.245;printf("%f,%f\n",a,b);}输出:63.245...
#include<stdio.h>
main()
{
double a=63.245;
float b=63.245;
printf("%f,%f\n",a,b);
}
输出: 63.245000,63.244999
为什么会不一样呢?
(编译器:Microsoft Visual Studio 2010) 展开
main()
{
double a=63.245;
float b=63.245;
printf("%f,%f\n",a,b);
}
输出: 63.245000,63.244999
为什么会不一样呢?
(编译器:Microsoft Visual Studio 2010) 展开
展开全部
很正常的嘛,浮点的存储是按照IEEE754标准的。简单的说它内部是2进制的,63.245 根本不可能用2进制的浮点精确表示,所以才会有很少的误差。这是正常的。
追问
为什么double输出的是正确的呢?我觉得应该不是有效数字的问题,小数点后才三位。double和float应该都是2进制存储,为什么double就能精确表示呢?
追答
double当然也不是精确表示的,只不过默认情况下浮点只显示6位小数,底层做了过滤而已。double因为精度比float大一倍多一些,所以在这个数上面来说,误差要小一些,而默认又显示6位的情况下,后面的误差就显示不出来了,不信你试试设置小数点显示15位,看看后面是什么就明白了。
能不能精确表示不是看多少位的,下面的也有好多人回答了你关于2进制浮点如何表示的问题。
展开全部
首先我们要确定一点,计算机中的浮点数和整数一样,并不是我们在生活中用的10进制,这一点你可以参见IEEE754标准中的定义
http://baike.baidu.com/link?url=1uzF-ySHDP1FUmNTRMMPPH_WbE1RpRY_BZ_vkOlz2xOhhLfHfZntkd5u1avSdVVKrUw-C6_eNMUdOPTENVv1y_
(百度百科)
然后我们就知道,二进制的小数精度和十进制的小数精度在进行转换的时候是会有出入的
十进制里面,我们的精度是0.1, 0.01, 0.001, ....
二进制里面的精度则是1/2, 1/4, 1/8, 1/16, ......也就是0.5, 0.25, 0.125, 0.0625, .....
自然在多数情况下不会出现按十进制的某一位截断的情况
http://baike.baidu.com/link?url=1uzF-ySHDP1FUmNTRMMPPH_WbE1RpRY_BZ_vkOlz2xOhhLfHfZntkd5u1avSdVVKrUw-C6_eNMUdOPTENVv1y_
(百度百科)
然后我们就知道,二进制的小数精度和十进制的小数精度在进行转换的时候是会有出入的
十进制里面,我们的精度是0.1, 0.01, 0.001, ....
二进制里面的精度则是1/2, 1/4, 1/8, 1/16, ......也就是0.5, 0.25, 0.125, 0.0625, .....
自然在多数情况下不会出现按十进制的某一位截断的情况
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当然不一样啦,单精度(float),双精度(double)。
它们可以接收的实型常量的有效数字位数是不同的。
就是说,double型可以接收实型常量的16位的有效数字,但是float只能就收实型常量的7位有效数字,在有效数字后输出的数字都是不准确的。
它们可以接收的实型常量的有效数字位数是不同的。
就是说,double型可以接收实型常量的16位的有效数字,但是float只能就收实型常量的7位有效数字,在有效数字后输出的数字都是不准确的。
更多追问追答
追问
63.245,一共5个数字,在7位之内啊
追答
不好意思啊,等我先下个VS2010看看。我一直用CodeBlocks。没有在意这些问题。下午问下老师。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为超出了float的精度但没有超出double的精度
追问
63.244999比63.245的精度更高吧 - -
如果真的超出精度直接截取部分就好了,不明白为什么会少那0.000001
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询