浮点数不能像整形那样直接用 if(a==b) 这样来进行条件判断,因为浮点数用float或者double是不精确的表示。
float精确到小数点后6位
double精确到小数点后15位
所以,也就是说,如果一个float小于0.000001,我们就不知道是否为有效的了,也可以认为近似为0了。
同理一个double的有效范围为1e-15,小于1e-15的double类型我们就可以认为近似为0
在代码里,我们就可以像下面这样通过对浮点数取绝对值后和1e-6或者1e-15来比较判断是否为0
float f1=0;
doube d2=0;
if(fabs(f1) < 1e-6)
{//0
}
if(fabs(d2) < 1e-15)
{//0
}
我们判断两个浮点值是否相等就可以通过相减取绝对值的方式来做了。
float f2=0,f3=0;if(fabs(f2-f3) < 1e-6)
{//0
}
-------------------------------------------------------------------导致以上的原因呢?就是下面这样---------------------------------------------------------------
另外在计算机中存储float和double按照下面方式。
float:
1bit(符号位) | 8bits(指数位) | 23bits(尾数位) |
double:
1bit(符号位) | 11bits(指数位) | 52bits(尾数位) |
1、范围
所以float有8bit指数 最大为2^128
而double有11bit指数 最大为2^1024
2、有效位
尾数位决定了有效位
float: 2^23 = 8388608,一共7位,所以取6位有效
double: 2^52 = 4503599627370496,一共16位,取15位有效。