定点数表示法

定点数表示法#

\(n\)\(p\) 进制自然数可以表示为:

(1)#\[\begin{split} \begin{aligned} x &= x_0 x_1 \cdots x_{n-1} x_{n} . x_{-1} \cdots x_{-n+1} x_{-n}\\ &= (x_0, x_1, \cdots, x_{n-1}, x_{n}, x_{-1}, \cdots, x_{-n+1}, x_{-n}) \begin{bmatrix} p^n \\ p^{n-1} \\ \vdots \\ p^1 \\ p^0 \\ p^{-1} \\ \vdots \\ p^{-n+1} \\ p^{-n} \end{bmatrix} \end{aligned} \end{split}\]

这里 \(p=2\)

定点和浮点都是数值的表示,它们区别在于,将整数(integer)部分和小数(fractional)分开的点在哪里。定点保留特定位数整数和小数,而浮点保留特定位数的有效数字(significand)和指数(exponent)。

定点数指的是小数点固定的存储方式,因为小数点固定,所以不需要额外使用存储空间存储小数点,只需要约定好即可。计算机中定点数有两种类型:

定点小数

纯小数,约定的小数点位置在符号位之后、有效数值部分最高位之前。

若数据 \(x=s_0.x_{-1} x_{-2} \cdots x_{-n}\),其中 \(s_0\) 为符号位,\(x_{-1} \cdots x_{-n}\) 为数值有效部分,也称为 尾数\(x_{-1}\) 为最高有效位。

一般说来,如果最末位 \(x_{-n} = 1\),前面各位都为 \(0\),则数的绝对值最小,即 \(|x|_{\min} = 2^{-n}\)。如果各位均为 \(1\),则数的绝对值最大,即 \(|x|_{\max} = 1-2^{-n}\)。所以定点小数的表示范围是:\(2^{-n} \leq |x| \leq 1 - 2^{-n}\)

定点整数

纯整数,约定的小数点位置在有效数值部分最低位之后。

若数据 \(x=s_0x_1 x_2 \cdots x_n\),其中 \(s_0\) 为符号位,\(x_1 \cdots x_n\) 为数值有效部分,也称为 尾数\(x_1\) 为最高有效位。

定点整数的表示范围是:\(1 \leq |x| \leq 2^{n} - 1\)

当数据小于定点数能表示的最小值时,计算机将它们作 \(0\) 处理,称为 下溢;大于定点数能表示的最大值时,计算机将无法表示,称为 上溢,上溢和下溢统称为 溢出

计算机采用定点数表示时,对于既有整数又有小数的原始数据,需要设定一个缩放因子,数据按其缩小成定点小数或扩大成定点整数再参加运算,运算结果,根据缩放因子,还原成实际数值。若缩放因子选择不当,往往会使运算结果产生溢出或降低数据的有效精度。

用定点数进行运算处理的计算机被称为 定点机

定点数实例#

可以使用 bin() 将整数转换为二进制表示。

bin(0), bin(1), bin(2), bin(3), bin(4), bin(5), bin(6)
('0b0', '0b1', '0b10', '0b11', '0b100', '0b101', '0b110')

对于 25.125 表示为定点整数需要如下操作:

  1. 将整数部分转换为定点整数:

bin(25)
'0b11001'
def fixed_inter(x):
    L = []
    while x != 0:
        L.append(str(x % 2))
        x = x // 2
    L.reverse()
    x = "0b" + "".join(L)
    return x
fixed_inter(25)
'0b11001'
  1. 小数部分转换为定点小数:

import numpy as np


def fixed_decimal(x):
    L = []
    while x != 0:
        x, b = np.modf(x * 2)
        L.append(str(int(b)))
    x = "." + "".join(L)
    return x
x = 0.125
fixed_decimal(x)
'.001'

拼在一起就是:

fixed_inter(25) + fixed_decimal(x)
'0b11001.001'