您的位置:首页 > 其它

浮点数的内存表示

2013-03-25 17:28 260 查看
判断浮点数是否相等如果用下面的方法:

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这样的语句。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: