判断浮点数是否相等如果用下面的方法:
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这样的语句。
浮点数的内存表示
最新推荐文章于 2023-01-05 22:45:50 发布