浮点数,实数类型,常用的主要有两种: float单精度(32位)和double双精度(64位)。它们虽然占用位数不同,但是编码方法是一致的。

float encoding standard

浮点数编码标准

如上图,S为符号位,0正1负,E为指数位,float中8位,double中11位,T为数据位,float中23位,double中52位。

浮点数的计算方法:

  1. E = 2 ** w - 1,且T != 0时,表示非数字NaN
  2. E = 2 ** w - 1, 且T = 0时,表示为无穷数,符号根据S确定
  3. 1 <= E <= 2 ** w - 2, 且T != 0时, \(v = (-1)^S \times 2 ^ {E-bias} \times (1 + 2 ^ {1-p} \times T)\)
  4. E = 0, 且T != 0时, \(v = (-1)^S \times 2 ^ {2-2^{(w-1)}} \times (0 + 2 ^ {1-p} \times T)\)
  5. E = 0, 且T = 0时,表示0,符号根据S确定

用C将浮点数写至文件:

FILE *fp = fopen("t", "w");
float i = 43.21;
fwrite(&i, 4, 1, fp);
fclose(fp);

然后得到的结果为:

0000000: 0ad7 2c42 ..,B

存储方式为little-endian,转换至实际的二进制表示为0100,0010,0010,1100,1101,0111,0000,1010, 故S=0,E=0b10000100=132,T=0b01011001101011100001010=2938634,可得:

\begin{equation*} \begin{array}{l} v & = & (-1)^S \times 2 ^ {E-bias} \times (1 + 2 ^ {1-p} \times T) \\ & = & (-1)^0 \times 2 ^ {132-127} \times (1 + 2 ^ {1-24} \times 2938634) \\ & = & 2 ^ 5 \times (1 + 2 ^ {1-24} \times 2938634) \\ & = & 43.209999084472656 \\ & \thickapprox & 43.21 \end{array} \end{equation*}
comments powered by Disqus