上面的两个结果你是不是写反了? -- 这里涉及到两个精度问题,即指定的精度,以及类似float、sum的c数据的精度。
printf("%f\n",x);
%f,未指定精度(位数),c默认为新颖点后6位,因此被截断(四舍五入)
printf("%.12lf\n",x);
这里指定精度为小数点后12位,因此输出为12位; 但之所以和原来的赋值不一样,是因为x的类型是float,而不是float。 float本身的精度不如float。 这个话题由来已久,涉及到小数在计算机中的存储方式。 简单来说,十进制的小数部分是按照1/2+1/4+1/8+....的方式来近似的,因此存在误差,也就是所谓的{存储精度}问题。
float,浮点数的32位表达为:0~22位=尾数; 23~30为指数位,31位为重合位。
浮动 x = 1.=
x = 1. =
由于y本身是(64位存储,尾数用52位表示,由11位指数位和1位符号位组成),所以计算机的存储精度必须很高。
y=9。 =
y=9。 =
因此,如果可能的话,请使用它。