浮点数 floating point

2019-05-25 09:39:38 浏览数 (1)

[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. 以指数较大的数为准,把另一个数的指数偏移 ↩
  2. 这里的规格化并不是指定点小数的规格化。此处的浮点数规格化是指化成 $1.xx * 2^m$ (m >= 0)的规格化科学计数,而定点小数的规格化要求1/2 ≤ M <1。 ↩
  3. 书中的规格化有两个语言背景:(1)定点小数的规格化,要求1/2 ≤ M <1(2)浮点数相加时,对于结果的规格化,要求按照规格化科学计数的标准操作。此外,按照EEE754标准对浮点数进行"规格化"的操作,它的正式说法叫做标准化

0 人点赞