如何深刻理解IEEE浮点数的表示(IEEE floating-point representation)

引言

大家都知道,可以在计算机处理器直接运行的是由0,1构成的机器代码(machine code),本文将介绍浮点数(floating-point number )在机器码中是如何被编码表示的
整数(integer)是如何被编码的呢?小伙伴们应该听过补码,原码,反码吧,这些正是整数被编码的不同规则。

原码:一定字长,在不溢出的情况下,最高位是符号位,跟上该整数二进制表示。符号位中0代表正数,1代表负数。
补码(two's compliment):最高位也是符号位,但是与原码不同的是符号位也参与到求值里。
例如:1001=-2^3+1=-7
而原码中 1001=-1

代表同一数值的原码是可以转换成其补码的。

 很多文章里说补码是无法直接转换成十进制数值,要先换成原码再求,其实这是错误的。理解补码最高位也是参与值的即可。

后续笔者将会撰写一篇文章详细讲解原码,补码,以及反码。

下面开始正题吧!

浮点数(floating-point number)是什么

其实计算机表示小数有两种方式:

  1. 定点数 (fixed-point)
  2. 浮点数(floating-point)
    区别在于,定点数编码小数时小数点位置是确定的,浮点数小数点位置是可以变化的。
    如何用科学计数法来表示二进制小数,即形如:
    V = ( − 1 ) s × M × 2 E V=(-1)^s \times M \times 2^E V=(1)s×M×2E
    0.25(d)可以写作
    0.01 ( b ) × 2 0 0.01(b)\times2^0 0.01(b)×20
    也可以写作
    1.0 ( b ) × 2 − 2 1.0(b)\times 2^{-2} 1.0(b)×22
注:括号中的字母
d表示十进制 decimal
b表示二进制 binary
h表示十六进制 hexadecimal

IEEE floating-point representation

正如上文所述,IEEE

### IEEE 754标准下的浮点数与十六进制转换方法 IEEE 754 是一种广泛使用的浮点数表示标准,定义了如何将实数存储为二进制形式。对于32位单精度浮点数(也称为 float 类型),其结构由三部分组成:符号位、指数位和尾数位。 #### 浮点数到十六进制的转换过程 1. **提取各部分信息** 对于一个给定的浮点数值 \( F \),首先将其分解成符号位 \( S \)、指数偏移量 \( E \) 和尾数 \( M \)[^1]。具体来说: - 符号位 \( S \): 如果 \( F > 0 \), 则 \( S = 0 \); 否则 \( S = 1 \). - 指数部分 \( E \): 计算原始指数并加上偏置值 (对于单精度浮点数, 偏置值为 127). 结果应位于范围 [1, 254]. - 尾数部分 \( M \): 提取有效数字的小数部分,并去掉隐含的前导 '1.'. 2. **组合成二进制字符串** 把上述三个部分拼接起来形成完整的32位二进制串[^2]: ```plaintext SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM ``` 3. **转为十六进制表示法** 接下来把这32位分成每组四位一组共八组,再分别映射至对应的十六进制字符上完成最终表达式的构建[^3]. #### 十六进制到浮点数的逆向转换流程 当已知某个特定格式(比如大端序或小端序卡特尔编码) 的四个字节组成的十六进制码时,则可以通过如下步骤还原出相应的浮点数值: 1. 解析输入数据流中的每一位含义; 2. 根据解析后的结果重建原来的科学计数法形式; 3. 应用反函数运算得到目标十进制近似解。 下面给出一段基于 Python 实现的例子来展示这一双向变换逻辑: ```python import struct def float_to_hex(f): """Convert a floating point number to its hexadecimal representation.""" return hex(struct.unpack('<I', struct.pack('<f', f))[0]) def hex_to_float(h): """Convert a hexadecimal string back into a floating-point value.""" i = int(h, 16) return struct.unpack('!f', struct.pack('!I', i))[0] # Example Usage: example_float = 1.0 hex_representation = float_to_hex(example_float) print("Hexadecimal Representation:", hex_representation) converted_back = hex_to_float(hex_representation[2:]) # Remove the leading '0x' print("Converted Back Float Value:", converted_back) ``` 此脚本利用Python内置库`struct`, 它可以轻松处理不同类型的低级数据表现形式间的互换操作[^4].
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值