内存中浮点数的存储形式

备注:基于“IEEE-754(IEEE二进制浮点数算术标准)”

Catalog 目录

1 - 1.1 浮点数组成剖析

2 - 2.1 单精度浮点数的组成

     2.2 实数转单精度浮点的步骤

3 - 3.1 双精度浮点数的组成

     3.2 实数转双精度浮点的步骤

1.1 浮点数组成剖析

一个浮点数 (Value) 的表示其实可以这样表示:

    value = sign × exponent × fraction

也就是浮点数的实际值,等于符号位(sign bit)乘以指数偏移值(exponent bias)再乘以分数值(fraction)。

单精度:

双精度:

2.1 单精度浮点数的组成

2.2 实数转浮点的步骤

PS:为了数学处理器的硬件设计更简单以及更少的晶体管消耗, 指数部分被加上一个常数作为偏置指数。

  1. 实数转换为二进制形式;

  2. 科学计数法表示二进制: 1.xxx E yyy ();

  3. 第31位填充0(正数)或1(负数);

  4. 指数部分, yyy加上0x7F作为偏置指数, 填充第30~23位;

  5. 有效数字部分填充第22~0位;

例1 将转换成单精度(短实数)浮点。

9.75(10) = 1001.11(2) =1.00111*e^3
符号       bit31    为 0
偏置指数   bit30-23 为 1000 0010(3+7F=82H)
有效数字   bit22-0  为 001 1100 0000 0000 0000 0000
即
    二进制    0100 0001 0001 1100 0000 0000 0000 0000
    十六进制    4    1    1    C    0    0    0    0

例2: Convert decimal 15.575 to IEEE single-precision standard.

化成二进制形式
    15 = 0xF = 0b1111
    0.575 * 2 = 1.15    1
    0.15  * 2 = 0.3     0
    0.3   * 2 = 0.6     0

    0.6 *  2  = 1.2       1
    0.2 *  2  = 0.4       0
    0.4 *  2  = 0.8       0
    0.8 *0.2  = 1.6       1

    15.575 = 1111.100 1001 1001... = 1.111 1001 0011 0011 e^3
指数: 3+0x7F = 0x82 = 1000 0010
浮点: 0100 0001 0111 1001 0011 0011... = 0x41793333

例3: Convert decimal –0.00075 to IEEE single-precision standard.

使用16进制转换为二进制形式
    0.00075 * 16 = 0.012    0
                 = 0.192    0
                 = 3.072    3
                 = 1.152    1
                 = 2.432    2
                 = 6.912    6
                 = 14.592   E
                 = 9.472    9
                 = 7.552    7
二进制形式: 0.00075 = 0x0.3126E97 E -2= 0b 1.1000100100110111010010111 E -11
指数: -0xB+0x7F = 0x74 = 0b 0111 0100
浮点: 1011 1010 0100 0100 1001 1011 1010 0110 = 0xBA449BA6

3.1 双精度浮点数的组成

52位有效数字, 11位指数, 第63位表示符号. 转换过程和单精度浮点一样, 首先表成1.xxx E yyy, 然后yyy加3FF得到偏置指数。

如下图所示:

3.2 实数转双精度浮点的步骤

转换步骤和单精度的类似。

例4: Convert decimal 152.1875 to double-precision FP.

152.1875 = 二进制10011000.0011 = 科学二进制1.00110000011*e^7
符号       b63     = 0
偏置指数   b62-b53 = 10000000110 (7+3FF=406)
有效数字位 b52-b0  = 00110000011000…..000

0100 0000 0110 0011 0000 0110 0000 0000 0000 ...  0000
4    0    6    3    0    6    0    0    0    ...  0

猜你喜欢

转载自blog.csdn.net/qq_39478139/article/details/107375117
今日推荐