[Toc]
小数
- 正数:原码=补码
- 负数:
- 原码 = 正数部分(去掉负号)的二进制值,且符号位(最左边的比特位)为1
- 反码 = 正数部分(去掉负号)的二进制值,按位取反
- 补码 = 反码 1
- 小数点依旧用点
- 纯小数的原码、反码、补码
补码的引进就是为了解决机器上减法运算不便的,思想是使符号位参与运算,即用补码表示的负数进行加法运算就相当...http://www.jianshu.com/p/979f6e89cb7a
浮点数
- 浮点数由阶码, 尾数和符号位(数符位)组成
单精度与双精度
指数
- 是以类似移码的形式出现
- 双精度与单精度都保留00000000 与 11111111。
- 单精度偏移127,双精度偏移1023。
- 单精度的指数范围: -126 到 127 (1 - 127 到 254 - 127)
- 双精度的指数范围:1 - 1023 到 2046 - 1023
尾数
尾数没有需要保留的数。最大都是全1,最小都是全0
特殊情况
指数全为1
尾数全为0
- 视为无穷大。
- 若符号位为1则是负无穷大,为0 则是正无穷大。
- 运用无穷大,在计算中无需检查溢出。
尾数不全为0
- 视为无效操作结果(NaN)
浮点数相加
步骤
代码语言:javascript复制graph TD
A(对大阶) -->B(加有效数)
B --> C(规格化)
C --> |溢出处理| D(舍入处理)
D --> E(决定符号位)
1.对大阶[1] 2.加有效数(指数已相同,把有效数部分相加) 3.规格化[2],溢出处理(使其变为科学表示法形式) 4.舍入处理
舍入处理
博客
- 舍入问题 举了几个例子
- 浮点数运算中的舍入问题
内容
有两种
- “0舍1入”法:右移时被丢掉数位的最高位为0则舍去,反之则将尾数的末位加“1”。
- “恒置1”法:只要数位被移掉,就在尾数的末位恒置“1”。从概率上来说,丢掉的0和1各为1/2。
溢出处理
阶码溢出
- 上溢 超过了阶码可能表示的最大值的正指数值,一般将其认为是 ∞和-∞。
- 下溢 超过了阶码可能表示的最小值的负指数值,一般将其认为是0。
尾数溢出
- 尾数上溢 两个同符号尾数相加产生了最高位向上的进位,将尾数右移,阶码增1来重新对齐。
- 尾数下溢 在将尾数右移时,尾数的最低有效位从尾数域右端流出,要进行舍入处理
浮点数相乘
步骤
代码语言:javascript复制graph TD
A(数相加) -->B(尾数相乘)
B --> C(规格化)
C --> |检查溢出| D(舍入)
D --> E(决定符号位)
规格化[3]
目的
为了提高数据的表示精度,为了数据表示的唯一性,它与浮点数的标准化并无关系
步骤
代码语言:javascript复制一个浮点数有不同的表示:
0.5
0.05 * 10^1
0.005 * 10^2
50 * 10 ^-2
尾数为R进制的规格化: 绝对值大于或等于1/R。
尾数规格化:1/2 ≤ M <1, 最高有效位绝对值为1,其中 M为尾数。
在计算机内,其纯小数部分被称为浮点数的尾数,对非 0 值的浮点数,要求尾数的绝对值必须 >= 1/2,即尾数域的最高有效位应为1,称满足这种表示要求的浮点数为规格化表示: 0.1000101010 把不满足这一表示要求的尾数,变成满足这一要求的尾数的操作过程,叫作浮点数的规格化处理,通过尾数移位和修改阶码实现。
- 以指数较大的数为准,把另一个数的指数偏移 ↩
- 这里的规格化并不是指定点小数的规格化。此处的浮点数规格化是指化成
$1.xx * 2^m$
(m >= 0)的规格化科学计数,而定点小数的规格化要求1/2 ≤ M <1。 ↩ - 书中的规格化有两个语言背景:(1)定点小数的规格化,要求1/2 ≤ M <1(2)浮点数相加时,对于结果的规格化,要求按照规格化科学计数的标准操作。此外,按照EEE754标准对浮点数进行"规格化"的操作,它的正式说法叫做标准化 ↩