# 二进制小数的表示
与十进制小数一样,二进制小数点左边为正幂,小数点右边为负幂,幂的底数为 2。
# 二进制小数与十进制转换
二进制转十进制
二进制 表示数字 。
十进制转二进制
因为不知道怎么表示,直接从菜鸟偷了图:
这张图以 为例,
通过例子还是很容易理解这些转换步骤的。
小数点可以移动,左移表示除以 2,右移表示乘以 2。 表示数 ,左移一位 表示数字 。同理右移就是乘 2 了。
同十进制小数只能精确表示 10 的幂组成的数一样,二进制小数也只能精确表示由 2 的幂组成的数。同十进制小数一样,如果想要更接近不能精确表示的数,只有通过增加位数来逐渐近似。十进制不能准确的表达像 和 这些数,只能表示 这种类型的数。二进制也不能表示准确的表示 这种数,只能表示那些能够被写成 这种类型的数。
# IEEE 浮点表示
IEEE 浮点标准用 来表示一个数。
表示符号位,当 s = 0,V 为正数;当 s = 1,V 为负数。
M 表示有效数字,大于等于 1,小于 2。
表示指数位。
根据图来理解这个公式(别管里面的数字):
对于 64 位的浮点数,最高的 1 位是符号位 S,接着的 11 位是指数 e(注意注意,这里的阶码字段 e 可以用来计算阶码 E,后面会提到),剩下的 52 位为有效数字 M。
对于 32 位的浮点数,最高的 1 位是符号位 s,接着的 8 位是指数 e(跟上面一样),剩下的 23 位为有效数字 M。
我们可以从上面知道 M 的值,但是我们还不知道如何计算阶码 E,根据阶码字段 e(exponent)我们可以分成三种不同的情况。
** 情况 1 **:规格化的值
e 的位模式不全为 0(数值 0) 或不全为 1(单精度数值为 255,双精度数值为 2047)。阶码的值 (e 是无符号数),这里的 表示偏置值这个值等于 (单精度是 ,同理双精度是 1023)。尾数 , 表示小数值。
情况 2:非规格化的值
e 的位模式全为 0。阶码的值 ,而尾数,表示小数字段的值。
情况 3:特殊值
e 的位模式全为 1,看上面的第三条数据,当小数域全为 0 时,得到的数表示无穷(s=0 时是正无穷)。当小数域为非零时,结果值叫 “NaN”。
通过公式看永远都是抽象的,通过例子理解更好。
我们这里以 转 float
的二进制表示举例:
数字 二进制为 。
根据规格化数的表示规则,我们将 12345 用以下的方式表示:
==>
根据 IEEE 浮点数的编码规则,我们需要将小数点左边的 1 丢弃
这个长度为 13,但是由于单精度的小数字段长度为 23,我们需要在末尾增加 10 个零
所以我们这就得到了小数字段 frac,从 12345 的规格化表示可以发现阶码 E 的值为 13。
,因为本题符合情况 1,由公式 ,求出 e 的值为 。 二进制为 。根据 IEEE 规定 32 位浮点数符合以下规则:
加上符号位 0 我们最终得到:
这就将整数转换成浮点数的二进制了。
# 这东西实在太难了,不写出来估计我看过就忘了。
参考文章:
十进制小数转化为二进制小数 | 菜鸟教程 (runoob.com)
【CSAPP - 深入理解计算机系统】2-4. 浮点数 (下)_哔哩哔哩_bilibilititle: 深入了解计算机系统笔记
cover: https://cos.asuka-xun.cc/blog/assets/CSAPP.jpg
date: 2022/12/26
categories:
- [二进制杂谈]
tags: - 计算机科学
- CSAPP