基础概念
浮点数的逻辑示图:
- Exponent指数 (IEEE754标准规定该固定值得表达式)E=2^(e-1)-1或 E=2^e-2,E偏移的值在(0,2e-2]之间,即0<E<=2e-2)S(sign)表示符号位。对应值S满足:假如浮点数为N,N>=0时,S=0; N<0时,S=1
- E(exponent)表示指数位,位于S和M之间的若干位。对应值e值也可正可负
- M(mantissa)表示尾数位,也叫有效数字位(significand)、系数位(coefficient), 甚至被称作"小数"。
*公式中: e-1我们称之为指数偏移差;e为存储指数的bit(比特)的长度;Exp为指数偏移值(exponant bias)。
存储方式(IEEE754)
单精度浮点数的存储方式
在不同的环境(计算机32位或64位)或编程语言中表示的浮点类型也有各自的差异,比如:单精度浮点数(C#语言中用float表示单精度浮点类型)的表示:
根据上述公式可得到单精度浮点类型的固定偏移值:
E=2^(e-1)-1 => E=2^(8-1)-1=> E=127 (单精度浮点类型的固定偏移值 127);
双精度浮点数的存储方式
双精度浮点数(C#语言中用double表示双精度浮点类型)的表示:
根据上述公式可得到单精度浮点类型的固定偏移值:
E=2^(e-1)-1 => E=2^(11-1)-1=> E=1023 (单精度浮点类型的固定偏移值 1023);
举例:求单精度浮点类型的 float f=10.3f (C#的语言)二进制
Step 1:先求实数的绝对值的二进制格式(Binary)。
10的二进制:1010 。(10除以2依次求余,然后从下往上取余数)
Step 2:求小数部分的二进制(Binary)。
0.3的二进制:0100110011...0011... (小数部分二进制算法:小数部分乘以2,如果大于1,取1,否则取0)
Step 3:求Sign符号位的二进制
因为10.3>=0,所以Sign(符号位)位:0 。
Step 4: 求Exponant指数位的二进制
其中单精度浮点数10.3中整数部分的10的二进制位为1010,即1.01*10^3。那么10.3的偏移码值为:3(1.01*10^3的指数值)加上127(单精度浮点数的固定偏移值),即130(编码值为: Exp=3+127=130 )。
偏移码值130的Binary(二进制)为:1000 0010,即Exponant => 1000 0010.
Step 5: 求Mantissa(尾数)的二进制
在求10.3整数部分的二进制值时,我们将1010变为了1.01*10^3,接合尾数0100 1100 1100 ....,即1.0100 1001 1001..*10^3。
即Mantissa(尾数) 0100 1001 1001 1001 1001 101 。
float f=10.3f 存储方式:
至于双精度在这里就不举例子了(将Step4中单精度固定偏移值127换成双精度固定偏移值1023,同时注意补位)。