赞
踩
我们知道浮点数在存储是会发生精度丢失的情况,致使数据无法精确存储,这里我将讲解有关浮点数存储是长度与精度的问题。以下我将以float为例。
根据标准规定任意一个浮点数都必须表示为(-1)SxMx2^E
其中S为符号位:S为0表示正数,S为1表示负数。
其中M为有效数字。M属于[12)。
其中E为指数。
图如下:
那么6.5是如何存储的?
如下:(对于浮点数而言6.5可以精确存储)
至此我们对浮点数的存储有了基本的了解,下面就要讲解浮点数为什么会有精度丢失的问题。
影响整数用浮点数方式存储导致精度丢失的原因在长度(有效数位)。
对于float型
若在不考虑指数的情况下,
其23位有效数位其可以表示的最大数是:1111 1111 1111 1111 1111 111
再加上默认的1,其数列为1111 1111 1111 1111 1111 1111
用浮点数的形式来表示就是 (-1)*0 1111 1111 1111 1111 1111 111 2^23
其转化为十进制就是16 777 215
所以对于整数而言浮点数(float)可连续的表示0~16 777 215 的数,超出这个范围就会发生精度丢失的情况。
而对于16 777 215的科学计数法的表现形式为1.6 777 215 x 10 ^7。所以其长度为8,即float最少保存8位有效数字不会发生精度丢失。
如下:
int main()
{
float i = 1234567;
float j = 12345678;
float k = 1234567891;
printf("%f\n", i);
printf("%f\n", j);
printf("%f\n", k);
return 0;
}
其结果如下:
影响小数存储于浮点数导致精度丢失的原因是二进制下的小数部分是跳跃的
如下:
所以对于小数部分不能表示成以上二进制相加的形式,就会发生精度丢失。
对于2.5(十进制)
其小数部分可以用二进制表示,则2.2就不会发生精度丢失。
int main()
{
float n = 2.5;
printf("%f\n", n);
return 0;
}
结果是:
对于5.2(十进制)
其小数部分不能用二进制表示,所以其会发生精度丢失。
其二进制数列为0100 0000 1010 0110 0110 0110 0110 0110。
int main()
{
float n = 5.2;
printf("%f\n", n);
return 0;
}
结果如下:
以上就是我对于浮点数的了解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。