如何实现将二进制0、1数组转换为浮点数的函数?
修复二进制数组转浮点数函数
问题描述
需要实现一个函数,接收0和1组成的二进制数组,返回对应的浮点数。当前binaryToFloat函数存在错误:输入[0, 1, 0, 0, 1, 1, 0, 0](对应4.8的4位整数+4位小数二进制近似)时,返回5.2而非预期的近似值4.75(因4.8的二进制小数是无限循环,仅取4位时为0.1100,对应0.75)。且只能使用提供的工具函数。
错误原因
原binaryToFloat函数的小数部分计算逻辑完全错误:
- 错误地将小数位的权重计算为
2^(3 - (i - 4)),随后除以10,这不符合二进制小数的权重规则(二进制小数每一位的权重是2^(-k),k为小数位的位置,从1开始)。
修复后的函数
def binaryToFloat(bits: List[int]) -> float: # 按数组长度拆分整数部分和小数部分(与floatToBinary逻辑对应,两者长度相等) split_idx = len(bits) // 2 int_bits = bits[:split_idx] frac_bits = bits[split_idx:] # 使用提供的bytesToNum计算整数部分 whole_part = bytesToNum(int_bits) # 计算小数部分:每一位对应2^(-(位置+1)) fractional_part = 0.0 for i in range(len(frac_bits)): if frac_bits[i] == 1: fractional_part += 2 ** (-(i + 1)) return whole_part + fractional_part
验证结果
调用binaryToFloat([0, 1, 0, 0, 1, 1, 0, 0])将返回4.75,这是4.8的4位二进制小数近似值(因0.8的二进制是0.11001100...无限循环,仅取4位时截断为0.1100,对应0.75)。
说明
- 该函数严格遵循
floatToBinary的逻辑:数组前半为整数部分的二进制(长度由floatToBinary的size参数决定),后半为小数部分的二进制(长度与整数部分相同)。 - 整数部分直接使用提供的
bytesToNum函数计算,确保符合工具函数的使用限制。
内容的提问来源于stack exchange,提问作者mitas1c
相关产品推荐
相关产品推荐

