Cancel

数字类型 - 表示和编码

Algorithm

·

October 09, 2024

时间有限,草稿版本,以后深入研究再修。

前言

一般地讲,数字类型的存储可以分为两层抽象,表示形式和(对表示形式)的编码方式。

整型(Integer)

表示形式

整型数字的表示形式没有什么特别的,就是它的自然二进制表示。1

编码方式

对于无符号整数和有符号的正整数来说,编码方式就是自然的二进制表示,只有对于有符号的负整数(包括负零)要考虑特别的编码方式。

有几种对于负整数的编码方式:

幅值编码(Sign–magnitude)

除了在最高有效位标记外,其他部分和正整数或无符号整数一样。

1 的补码(Ones’ complement)

对负整数的每一位都取反。

2 的补码(Two’ complement)

对负整数的每一位都取反,再加 1 。

主流编码方式。

偏移二进制(Offset binary)

也称为 excess-K ,就是加一个 K ,使得负数变为正数。

IEEE-754 规范的浮点数的指数部分就采用了这个方法的一个变种。

-2 基数

参考

浮点数(Float)

这里讲的是 IEEE-754 标准的浮点数。

表示形式

二进制形式的科学记数法。

\[( s ) \ 1.( t ) \times 2^{( e )}\]

十进制与二进制转换

使用过程中,隐含一个对于十进制与二进制转换的问题。

对于整数部分,没有任何问题,但是对于小数部分,很多常见的十进制数字是不能由 $2^{-1} + 2^{-2} + \dots 2^{-n}$ ,所精确表示的,实际存储的是一个近似的数学上的积分表示。

精度取舍

在向低精度舍入时,可以允许配置多种舍入策略,标准实现应该提供 roundTiesToEven 策略和 roundTowardPositive , roundTowardNegative 和 roundTowardZero 这三种有特定舍入方向的策略。

其中 roundTiesToEven 应该把它作为二进制表示数字的默认策略,十进制的表示数字的舍入策略是语言特定的,但也应当采取该策略。

roundTiesToEven

首先选择距离最近的那个数,

否则如果存在两个等距离候选,就选择那个最低有效位是偶数的,

否则就选精度部分数字(magnitude)最大的。

编码方式

按照最高有效位(MSB)的顺序具体如下:2

S

符号位,没什么好说的,最高有效位标记表示负数。

E

由于指数部分实际上是一个有符号整数,这里采取了 excess-K 的编码方案,$K=2^{e-1}-1$ ,这样距离零最远的负数加上 $K$ 后恰好为 $0$。

T

精度部分,省略了小数点前面固定的 $1$ 。

特殊值

当精度部分为 $0$ ,指数部分最小(偏移后为 $0$ ),此时存在当前精度无法表示的小数,也就是发生了 underflow ,此时的状态称为 subnormal。

反过来,如果指数部分最大(偏移后全为 $1$),则可能成为 $\pm\ \infty$ ,或者 NaN 。

规定精度部分全为 $0$ 则是 $\pm\ \infty$,否则为 NAN ,特别地 IEEE-754-2008 之后规定了精度部分最高有效位 $d_1$ 为 $0$ 表示 signaling NAN ,而其他属于默认的 quiet NAN。

注解

  1. 整型和整型运算本身就是 CPU 原始概念的一部分,从哲学意义上讲,是先有的合成实践,后分离出它的独立原型。 ↩

  2. 完整说明 : ↩

© minghu6

·

theme

Simplex theme logo

by golas