本文译自 《计算机科学基础——从数据操纵到计算理论》
今天因为要用到浮点数怎么转化为二进制进而在计算机里表示,只隐隐约约记得有个 IEEE 什么的,网上的资料也是鱼龙混杂,干脆找到大一的这本书来看看。不看不知道,一看吓一跳。老外写的东西就是简单详细。特此记录。
ps. 这里的 0 1 位有点多,我敲下来难免有错漏,欢迎大家指正。
文章目录
FLOATING-POINT REPRESENTATION
为了表示一个浮点数(一个有整数部分和小数部分的数)。这个数被分为两部分:整数部分和小数部分。比如,浮点数 14.234 分为 整数部分 14 和 小数部分 0.234.
转化为二进制(CONVERTING TO BINARY)
为了将一个浮点数转化为二进制,我们使用如下步骤:
- 将整数部分转化为二进制
- 将小数部分转化为二进制
- 在两部分之间放一个小数点(put a decimal point between the two parts)
转化整数部分 (Converting the Interger Part)
见第二章。
转化小数部分 (Converting the Fraction Part)
为了将小数转化为二进制,使用连续的乘法。比如,将 0.125 转化为二进制。
- 使用 2 乘这个小数,结果是 0.250。
结果的整数部分(0)被提取出来,作为二进制最左边的那一位。 - 然后继续用 2 乘这个小数部分 (0.250),得到 0.50
结果的整数部分(0)被提取出来,作为下一个二进制位。 - 持续这个过程直到小数部分为 0 或者达到一定精度。
ps. 书上算上这个有三个例子,这里只举一个。
例子
将小数 0.4 转化为 6 位二进制数。
归一化(NORMALIZATION)
为了表示 71.3125(+1000111.0101),我们需要在内存中存上符号、所有比特位和小数点的位置。虽然这个可以实现,但是这将数的操作弄得复杂了。你需要一个浮点数的标准表示形式。解决方法就是 归一化
。归一化就是移动十进制点使得这个点的左边只有一个 1。
1. x x x x x x x x x x x x x x x x x x x x x x x 1.xxxxxxxxxxxxxxxxxxxxxxx 1.xxxxxxxxxxxxxxxxxxxxxxx
为了能够继续表示这个数的原始值,我们需要乘上一个 2 e 2^e 2e。其中 e 就是小数点点移动的位数。然后我们根据原始数的符号添上正负号。
Original Number | Move | Normalized |
---|---|---|
+1010001.11001 | ← \gets ← 6 | + 2 6 +2^6 +26 × 1.01000111001 |
-111. |