1.背景介绍
在早期的计算机设计中, 只有定点计算, 没有浮点运算。不论是8位计算机, 16位计算机,还是32位计算机系统。 以32为计算机为例, 使用定点计算可以表示 0- 232 数值范围, 或者是-231 ~ +231之间。 即表达范围是 32’h0000_0000 ~ 32’hffff_ffff。数值表达范围在0-4G 这个空间。但随着科学计算的需要, 在32位计算机上,很多计算可能会需要很大的数值空间,同时,不可避免的需要使用小数(不是所有的应用都是整数计算的)。因此,浮点运算应运而生了。浮点计算在现代CPU设计中也会经常使用的。浮点运算的好处是可以表达更大的数值空间(不一定是232 ,在32位CPU 中, 可以表达更大的数值),缺点是增加了CPU 设计的复杂程度,有些数值不能被正确表示,只能通过近似值替代, 而且小数部分的数值空间也不是连续的。
2. 浮点数表示方式
![]()

图1

图2
以32为浮点为例, 浮点数由3个部分组成:
sign: 代表符号部分,表示当前的数是正数还是负数。举例10进制的1.5 = 0x3fc00000; 10进制的-1.5 = 0xbfc00000
exponent:指数部分,在2进制当中,表示的是2e 。 在CPU和FPGA等设计中都是以2进制为基础。
fraction:分数部分,即小数部分,在CPU 和FPGA 等设计中是指以2进制为基础的小数部分。
以上图为例:
位 23 = 1 => 1 或者 0 下文中会描述这个部分,bit23没有在32位浮点数中明确指出,有指数部分来决定这个位的数值。 位 22 = 1 =>0.5 位 21 = 1 =>0.25 位 20 = 1 =>0.125 位 19 = 1 =>0.0625 位 18 = 1 =>0.03125 . . 位 0 = 1 =>0.00000011920928955078125
以32位浮点为例: sign位 占1位;指数部分占8位;小数部分占23位。 指数部分和小数部分都是可以自行定义的。

图3
当然,国际组织IEEE754也作出了相应的标准。
3. IEEE754 标准

图4
- sign符号位:1位 (bit[31])
- exponent指数宽度:8位 (bit[30:23])
- fraction小数位:24 位 (bit[22:0]) ,最高位bit[23] 由 exponent 位决定)
| 指数部分 bit[30:23] | 小数部分 == 0 bit[22:0] | 小数部分 != 0 bit[22:0] | 真实数值计算公式 |
| 8’h00 | ±0 | 次正规数(subnormal Numbers) | (-1)sign * 2-126 * 0.fraction |
| 8’h01 ~ 8’hFE | 正常数值 (normalized value) | (-1)sign * 2exponent-127 * 1.fraction | |
| 8’hFF | ±无穷大 (infinity) | NaN (Not a Number) | |
正常数值范围的公式:

10进制(1.17549435082*e–38 ~ 3.40282346639*e+38),16进制(32’h0080_0000 ~ 32’h7f7f_ffff) e = 10
小数范围公式:

10进制(0 ~ 1.17549421069*e–38),16进制(32’h0000_0000 ~ 32’h007f_ffff) e = 10
在IEEE754标准中, 指数部分占8位, 数值范围8’h00 ~ 8’hff,这里有127 的偏移量。
4. 举例
10进制 1.5 = 20 * 1.5 = 2127 – 127 * 1.5 = 32’h 3fc0_0000 = 32’b 0_01111111_1000000000000000000
10进制 123.25 = 26 * 1.92578125 = 2133-127 * 1.92578125 = 32’h42f6_8000 = 32’b0_10000101_11101101000000000000000
| 步骤 | 操作 | 结果 | 比较 | 2进制记录值 |
| 1 | 1.92578125 *2 | 3.8515625 | >= 2 | 1 |
| 3.8515625 – 2 | 1.8515625 | |||
| 2 | 1.8515625 * 2 | 3.703125 | >= 2 | 1 |
| 3.703125 – 2 | 1.703125 | |||
| 3 | 1.703125 * 2 | 3.40625 | >= 2 | 1 |
| 3.40625 – 2 | 1.40625 | |||
| 4 | 1.40625 * 2 | 2.8125 | >= 2 | 1 |
| 2.8125 – 2 | 0.8125 | |||
| 5 | 0.8125 * 2 | 1.625 | < 2 | 0 |
| 6 | 1.625 * 2 | 3.25 | >= 2 | 1 |
| 3.25 – 2 | 1.25 | |||
| 7 | 1.25 * 2 | 2.5 | >= 2 | 1 |
| 2.5 – 2 | 0.5 | |||
| 8 | 0.5 * 2 | 1 | < 2 | 0 |
| 9 | 1 * 2 | 2 | = 2 | 1 |
| 2 – 2 | 0 | 结束 | ||
32’b0_10000101_11101101000000000000000
1.11101101
5. 在线浮点转换工具
https://www.h-schmidt.net/FloatConverter/IEEE754.html