单精度浮点精度 单精度浮点的有效数字一般有7~8位,取值范围+-(10^-38~10^38);
双精度浮点精度 单精度浮点的有效数字一般有15~16位;取值范围+-(10^-308~10^308);
写个程序来研究一下精度问题
以float数据类型为例
#include
int main()
{
float a=1234567.89f;//明显超过了float的有效数字;试着运行一下什么结果
printf("%f",a);
return 0;
}
运行结果为:1234567.875000
--------------------------------
Process exited after 0.006925 seconds with return value 0
请按任意键继续. . .
则当数据超过有效数字时,其余数字会变为随机数
再看下面的程序
#include
int main()
{
float a=1.345f,b=1.123f;//明显超过了float的有效数字;试着运行一下什么结果
float c = a + b;
if(c==2.468)
{
printf("相等!");
}else{
printf("不相等!c = %.10f或%f",c,c);
}
return 0;
}
运行结果:不相等!c = 2.4679999352或2.468000
--------------------------------
Process exited after 0.006725 seconds with return value 0
请按任意键继续. . .
?!为什么不相等呢,因为浮点型数据小数部分是有误差的,而且浮点型数据的输出精度会四舍五入
让我们试一试
#include
int main()
{
printf("%.3f\n",0.0039);
printf("%.30f\n",0.0039);
printf("%.3f\n",0.00039);
return 0;
}
输出结果为:
0.004
0.003899999999999999800000000000
0.000
--------------------------------
Process exited after 0.06182 seconds with return value 0
请按任意键继续. . .
可以看出,实型数据的表示会进行四舍五入
可以再写个程序看看是否正确
#include
int main()
{
printf("%.1f\n",1.555);
printf("%.1f\n",1.5546);
printf("%.1f\n",1.554);
return 0;
}
运行结果:
1.6
1.6
1.6
--------------------------------
Process exited after 0.06067 seconds with return value 0
请按任意键继续. . .
#include
int main()
{
printf("%.2f\n",1.556);
printf("%.2f\n",1.5546);
printf("%.2f\n",1.554);
return 0;
}
运行结果:
1.56
1.55
1.55
--------------------------------
Process exited after 0.06011 seconds with return value 0
请按任意键继续. . .
%.mf 可以让浮点数保留 m 位小数输出
保留的是精度为 四舍六入五成双
就是 5以下舍弃 5以上进位 而当下一位为5时要讨论:
被化简的小数位后面一位的数字等于5时
要看5前面的数字,若是奇数则进位,
若是偶数则将5舍掉,即修约后末尾数字都成为偶数;
若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
所以由以上例子可以看出,实数在计算机中只能近似表示,运算中也会产生误差;
所以,在判断浮点型数据是否相等时,可以给俩数据规定精度
eg:
#include
#include
int main()
{
flaot a,b;
if(fab(a-b)<1e-12)\\定义精度1e-12也可以1e-6等
{
}
}
以上就是本人所学心得,如有错误请指正
关于四舍五入相关问题可以看此博主C语言四舍五入文章
http://t.csdn.cn/0OU2R