浮点数的内存表示

来源:互联网 发布:盗墓笔记解密 知乎 编辑:程序博客网 时间:2024/06/12 01:21

判断浮点数是否相等如果用下面的方法:
float x = 0.6;
if(0.6 == x)
{
    ....
}
是不对的,得用下面的方法:
if((x - 0.6 <= 1e-6) || (x - 0.6 >= -1e-6))
{
    ...
}
原因是,浮点数在内存中的值不是一个精确值,比如0.6在内存中的值不是绝对与0.6相等。

对于Intel CPU,对32位浮点数的表示,用的是IEEE 754标准,即(从高位到低位):
1位符号位(0表示正数,1表示负数)
8位阶数位(用移码表示)
23位小数位(小数位需按IEEE 754规格化为1.fff...的样子,整数位的1省略)

比如,在我的机子里,在x地址处的内存值为:0x3F19999A
二进制为:0 01111110 00110011001100110011010
正数 阶数为-1 尾数为:1.00110011001100110011010
也就是:0.100110011001100110011010
化为十进制就是:0.60000002384185
和0.6已经非常相近了,但不是0.6,所以在if判断时不能用 0.6 == x这样的语句。