浮点数的内存表示
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这样的语句。
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这样的语句。
相关文章推荐
- 浮点数内存表示---记录一道题目
- 由(int&)a引发的思考及浮点数在内存中的表示
- 借助类型转化考察浮点数在内存中表示的一个心得
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 浮点数f和浮点数的相反数-f在内存中怎么表示
- java 鼠标简单控制和浮点数在内存中的表示方式
- 关于浮点数在内存当中的表示
- 浮点数在内存中的表示
- 浅谈计算机内存中浮点数的表示
- 浮点数在内存中的表示
- 浮点数内存表示方式与java中关于浮点数的类
- 浮点数在内存中的表示
- 计算机内存中浮点数的表示
- 浮点数在内存中的表示方式
- 浮点数在内存中的表示 实例
- 浮点数在内存中的表示
- 浮点数在内存中的表示
- 由(int&)a引发的思考及浮点数在内存中的表示
- 关于浮点数的小数部分的二进制表示、精度以及浮点数如何在内存中存放问题