小数在计算机中的表示

本文介绍了二进制如何表示小数,特别是浮点数的表示方式,包括单精度和双精度。浮点数由符号位、尾数位、基数位和指数组成,其中指数采用EXCESS系统表示。以0.75为例,解释了其在单精度浮点数中的具体表示过程,并提到计算机中某些小数无法精确表示的问题,以及在高精度需求场景下的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    扩展一下用二进制权值加权表示一个数的内容:用二进制表示整数,eg:1110=1*2^3+1*2^2+1*2^1+0*2^0;那对于用二进制如何表示小数呢,答案还是用加权形式,只不过权重不一样而已eg:1110.1110=1*2^3+1*2^2+1*2^1+0*2^0+  1*2^-1+1*2^-2+1*2^-1+0*2^-4。

    为了更好的存储小数,很多编程语言才采取了浮点数的形式表示,根据要求精度不一样,浮点数包含单精度和多精度两种。浮点数一般包含四部分,依次为:符号位、尾数位、基数位以及指数,单精度和多精度的不同在与用于表示指数和尾数的位数不同,PS,根据标准,小数基数为默认为1,因此,我们可操作的就是符号位、尾数位以及指数,对单精度来说,各位长度为1 8 23,双精度依次为1 11 52。

   浮点数在计算机内部的表示方法采取符号位用0/1表示,尾数部分采取将小数点前面的值固定为1,指数部分采取EXCESS系统表现,好高级的样子大笑,其实没那么夸张的,就是披了层皮而已安静

    小数0.75单精度如何表示呢?0-0111 1110-1000 0000 0000 0000 0000 000解析:第一个0表示的是符号位,这里表示正;0111 1110表示的是指数位,算一下,应该是126,因此指数内容为2的(126-127)次幂(这里用八位来表示指数,取表达中位数为,2的8次幂除2为127),这就是传说的EXCESS系统表现,也就是2的-1次幂,为0.5;1000 0000 0000 0000 0000 000为尾数位,因为采取将小数点前面的值固定为1,因此,在个1,尾数部分为1.1000 0000 0000 0000 0000 000,算一下,为1.5,传说中的小数点前面的值固定为1就是这个意思;综合一下1.5*2的-1次幂,确实等于0.75大笑

   对于有些小数比如0.1,用计算机是无法准确表示出来的,只能是一个精度比较高的近似值(类似1/3无法取到精确值一样,无法除尽),因此对于要求比较高的系统,如银行系统,据说会采取一种先倍乘法,后求除的方法来计算。

  另外,二进制用十六进制表示,简单的用四位二进制表示为一位十六进制数就好啦


### 补码表示法概述 在计算机科学中,补码是一种用于表示整数和小数的方法。对于正数而言,其补码与其原码相同;而对于负数,则通过特定规则计算得出。以下是关于如何用补码表示小数以及浮点数中的补码原理的相关说明。 #### 小数的补码表示方法 为了表示一个小数的补码,通常采用定点小数的形式。假设有一个二进制小数值 \(0.x_1x_2...x_n\) 或 \(-0.x_1x_2...x_n\) ,其中每一位 \(x_i\) 是 01 。 如果该值为正值,则它的补码就是它本身的二进制形式[^1]。如果是负值,则按照如下方式求得: 1. **取反操作**:将所有位按位取反(即将 0 变成 11 变成 0),不包括隐含的小数点前的符号位。 2. **加一操作**:对取反后的结果加上 1。 例如,给定一个负小数 \(-0.101_{(2)}\) 的补码表示: - 首先写出对应的绝对值部分:\(0.101_{(2)}\) - 对每位取反得到:\(1.010_{(2)}\) - 加上 1 后变为:\(1.011_{(2)}\) 因此,\(-0.101_{(2)}\) 在补码下的表现为 \(1.011_{(2)}\)。 #### 浮点数中的补码应用 当涉及到浮点数时,IEEE754标准并未直接使用补码来存储尾数,而是采用了偏移量技术处理指数字段并规定尾数总是规范化到接近于1的有效范围之内[^1]。然而,在某些特殊场景下或者教学模型里讨论过利用补码表达整个实数值的情况。 在这种假想条件下,假如我们希望以补码形式保存某个浮点型数据的话,可以遵循这样的原则——把实际数值拆解成为两部分:一个是整数部分,另一个则是纯小数成分。分别针对这两者单独转换为其对应类型的补码编码后再组合起来形成最终的结果字符串。 需要注意的是,这种做法并不常见于现代处理器架构之中,因为引入额外复杂度的同时并没有带来显著优势。而且正如前面提到过的那样,即使是在理论上探讨基于补码实现的浮点运算机制,也往往倾向于让原始输入先行变换至统一模式之下以便简化后续流程管理上的负担[^1]。 ```python def decimal_to_twos_complement_fraction(fraction, bits=8): """Convert a fractional part of a number to its two's complement binary representation.""" fraction_abs = abs(fraction) # Convert the absolute value into an integer by scaling up. scaled_value = int(fraction_abs * (2**(bits))) if fraction >= 0: return bin(scaled_value)[2:].zfill(bits) else: inverted_bits = ''.join(['1' if b == '0' else '0' for b in format(~scaled_value & ((1 << bits) - 1), f'0{bits}b')]) twos_comp = bin(int(inverted_bits, 2)+1)[2:] while len(twos_comp)<bits: twos_comp='0'+twos_comp return twos_comp[-bits:] print(decimal_to_twos_complement_fraction(-0.625)) # Example output might be something like '11010000' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值