21  进制

进制指数字的进位制度,如生活中用逢十进一的10进制,计算机使用2进制(binary)。8进制(octal),16进制(hex)也是计算机常用的。16进制中,用字母 a \sim f或 A \sim F表示10 \sim 15。

用10进制以外的进制表示数时,我们用小括号包围数字,把进制在括号的下标中注明,如 (100)_2, (a)_{16}

21.1 进制转换

一个数可以从一种进制表示转换为另一种进制表示。 进制转换不改变数的大小,只改变数的表示形式,因为其本质上与1斤=500克的单位转换相同。

注记例子:其他进制转10进制

可用10的幂次的加权和表示10进制数:789=7\times10^2+9\times10^1+9\times10^0

同理,可用k的幂次的加权和表示k进制数。只要计算过程使用10进制,就能实现k进制到10进制的转换。

例如,用2的幂次的加权和表示2进制数:(100100)_2=1\times2^5+1\times2^2=32+4=36,转换为了10进制。

注记例子:10进制转其他进制

对10进制数,可通过不断除以10、记录余数的方式,从个位开始逐位提取其数字。

同理,对k进制数,可通过不断除以k、记录余数的方式,逐位提取其k进制数字。

例如,对2进制数。可通过不断除以2,记录余数的方式,逐位提取2进制数字。

除 2 取余法将10进制转换为2进制。

21.2 不同进制的表示误差

一些进制下能用有限位小数精确表示的数,在其他进制下不能以有限位小数精确表示。 因此,计算机在表示10进制浮点数时,可能存在一定误差。

注记 21.1: 例子:数值在不同进制下可能存在不同的表示误差

(0.1)_3是3进制下的有限小数,在10进制下是1\times3^{-1}=1/3,不能用有限位小数表示。

10进制下的有限小数0.1,在2进制下是无限循环小数(0.0\dot{0}\dot{0}\dot{1}\dot{1})_2,也不能用有限位小数表示。

注记 21.2: 例子:2进制与10进制间的表示误差

因为0.1在二进制下是无限小数,而计算机只能存储有限位小数,因此Python在做相关计算时会引入误差,从而得出 0.1+0.2\neq 0.3 的结论。

0.1 + 0.2 == 0.3
False