首页 > 汇编语言 > 浮点数处理与指令编码
汇编语言IEEE二进制浮点数表示
x86 处理器使用的三种浮点数二进制存储格式都是由 IEEE 标准 754-1985。二进制浮点数运算 (Standard 754-1985 for Binary Floating-Point Arithmetic) 所指定。
下表列出了它们的特点。
由于三种格式比较相似,因此本节将重点关注单精度格式,如下图所示。32 位数值的最高有效位(MSB) 在最左边。标注为小数 (fraction) 的字段表示的是有效数字的小数部分。如同预想的一样,各个字节按照小端顺序(最低有效位 (LSB) 在起始地址上)存放在内存中。
二进制浮点数也可以使用加权位计数法。浮点数十进制数值 11.1011 表示为:
表中最后一项为 23 位规格化有效数字可以保存的最小分数。为便于参考,下表列出了二进制浮点数及其等价的十进制分数和十进制数值。
下表列出了它们的特点。
单精度 | 32 位:1 位符号位,8 位阶码,23 位为有效数字的小数部分。大致的规格化范围:2-126 〜2127 。也被称为短实数 (short real) |
双精度 | 64 位:1 位符号位,11 位阶码,52 位为有效数字的小数部分。大致的规格化范围:2-1022 〜21023 。也被称为长实数 (longreal) |
扩展双精度 | 80 位:1 位符号位,15 位阶码,1 位为整数部分,63 位为有效数字的小数部分。大致的规格化范围:2-16382〜216383。也被称为扩展实数 (extended real) |
由于三种格式比较相似,因此本节将重点关注单精度格式,如下图所示。32 位数值的最高有效位(MSB) 在最左边。标注为小数 (fraction) 的字段表示的是有效数字的小数部分。如同预想的一样,各个字节按照小端顺序(最低有效位 (LSB) 在起始地址上)存放在内存中。
1) 符号位
如果符号位为 1,则该数为负;如果符号位为 0,则该数为正。零被认为是正数。2) 有效数字
在浮点数表达式 m*be 中,m 称为有效数字或尾数;b 为基数;e 为阶码。浮点数的有效数字(或尾数)由小数点左右的十进制数字构成。同样的概念也可以扩展到浮点数的小数部分。例如,十进制数 123.154 可以表示为下面的累加和形式:123.154 = ( 1 X 102 ) + (2 X 101 ) + ( 3 X 100 ) + ( 1 X 10-1 ) + ( 5 X 10-6 )( 4 X 10-3 )
小数点左边数字的阶码都为正,右边数字的阶码都为负。二进制浮点数也可以使用加权位计数法。浮点数十进制数值 11.1011 表示为:
11.1011 = (1 X 21 ) + (1 X 20 ) + (1 X 2-1 )( 0 X 2-2 ) + (1 X 2-3 ) + (1 X 2-4 )
小数点右边的数字还有一种表达方式,即将它们列为分数之和,其中分母为 2 的幂。上例的和为 11/16 ( 或 0.6875):.1011 = 1/2+0/4+1/8+1/16=11/16
生成的小数部分非常直观。十进制分子 (11) 表示的就是二进制位组合 1011。如果小数点右边的有效位个数为 e 则十进制分母就为 2e :上例中,e=4,则有 2e=16。下表列出了更多的例子,来展示将二进制浮点数转换为以 10 为基数的分数。二进制浮点数 | 基数为 10 的分数 | 二进制浮点数 | 基数为 10 的分数 |
---|---|---|---|
11.11 | 3 3/4 | 0.00101 | 5/32 |
101.0011 | 5 3/16 | 1.011 | 1 3/8 |
1101.100101 | 13 37/64 | 0.00000000000000000000001 | 1/8388608 |
表中最后一项为 23 位规格化有效数字可以保存的最小分数。为便于参考,下表列出了二进制浮点数及其等价的十进制分数和十进制数值。
二进制 | 十进制分数 | 十进制数值 | 二进制 | 十进制分数 | 十进制数值 |
---|---|---|---|---|---|
.1 | 1/2 | .5 | .0001 | 1/16 | .0625 |
.01 | 1/4 | .25 | .00001 | 1/32 | .03125 |
.001 | 1/8 | .125 |
3) 有效数字的精度
用有限位数表示的任何浮点数格式都无法表示完整连续的实数。例如,假设一个简单的浮点数格式有 5 位有效数字,那么将无法表示范围在 1.1111〜10.000 之间的二进制数。比如,二进制数 1.11111 就需要更精确的有效数字。将这个思想扩展到 IEEE 双精度格式,就会发现其 53 位有效数字无法表示需要 54 位或更多位的二进制数值。所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算