IEEE浮点标准采用$V=(-1){^s}×M×2^E$来表示一个数,其中s表示符号位,M是一个二进制小数,称作尾数,E的作用是对浮点数进行加权,这个权重是2的E次幂。
本文主要讨论单精度的情况!
下图展示了将这三个字段装进字的最常见的形式。
在单精度浮点格式(C语言的float中,s=1,k=8,n=23)
- s代表一个单独的符号位
- k位的阶码字段,$exp=e_{k-1}…e_1e_0$编码阶段E
- n位的小数阶段$frac=f_{n-1}…f_1f_0$编码尾数M,编码的值依赖于阶码字段是否为0(也就是规格化还是非规格化)
给定位的格式,根据exp的值,被编码的值可以分成三种不同的情况(最后一种情况有两个变种),下图说明可对单精度的格式。
规格化
规格化的条件是exp字段不全为0并且不全为1。这是一个最最最普遍的情况。不同的情况对应的E,M和exp(k位),f(n位)之间的关系。当它是规格化的情况。$E=e-bias$,其中$bias$取决于k的大小($bias=2^{k-1}-1$),单精度的时候,计算来就是127。此时$M=1+f$。所以这个时候浮点数(单精度)的公式为:
\[V=(-1)^s×(1+f)×2^{e-127}\]非规格化-exp全为0
当exp全为0的时候,这个时候$E=1-bias$,$M=f$,主要用途就是为了表示以及接近0的数字。此时公式为
\[V=(-1)^s×f×2^{1-bias}\]非规格化-exp全为1
1.当exp全为1的时候,f为0的时候我们规定它表示无穷大
2.当exp全为1的时候,f不为0的话,表示一些无法表示的数,比如根号-1