32位单精度浮点数
- 在计算机中无法使用“浮点数 == 浮点数”
float float1 = 0.2;
float float2 = 2/10;
if(float1 == float2)
cout<<"float1 == float2"<<endl;
else
cout<<"float1 != float2);
浮点数在计算机中的表示
- sign 最高位表示符号域(bit31)
- exponent 8bit的指数域(bit23-bit30)
fraction 23bit的小数域(bit0-bit22)
指数部分
- 8位指数的取值范围为0~255(00000000~11111111),但在浮点数的阶码中,00000000与11111111被保留用作特殊情况,所以阶码可用范围只有1~254,总共有254个值。
- 为了能表示更小的数,IEEE754规定,指数有一个偏移常量127,即指数中的127表示0
- 指数范围(1 – 127 – 254)对应的实际值(-126 – 0 – 127)
小数部分
- IEEE754规定float的有效值为“小数部分+1”
- 小数部分全为0,表示的实际有效数字为1.0
- 小数部分全为1,表示的实际有效数字约为2
- 0.11111111111111111111 对应 1.11111111111111111111
- 二进制1.11111111111111111111 约等于10进制的 2
32bit的浮点数能表示的最小正数与最大正数
最小正数
小数部分全为0,指数部分为00000001
实际值 = 1.0 * 2^(-126) = 1.17549 * 10^(-38)最大正数
小数部分全为1,指数部分为11111110
实际值 = 2 * 2^(127) = 3.40282 * 10^(38)
现在看第一个浮点数不相等的例子,0.2在计算机中的存储如下图所示,可以看出计算机中实际存储的浮点数值并不等于0.2,实际值表示为0.20000000298023223876953125