计组-05-数据的表示(浮点数)

计组-05-数据的表示(浮点数)

前言

mark

  • 定点数的局限性

    • 在位数有限的情况下,无法增加数的表示范围
  • 浮点数

    • 在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度
  • 本章节基本要点

mark

1. 浮点数的表示形式

mark

  • 从科学计数法来理解浮点数的意义
    • r 为阶码的底 : 浮点数的底,一般r = 2
    • E 为阶码 : 通常用补码或者移码表示
    • M 称为尾数 : 通常用补码或者原码表示
    • 数字表示 N = r^E * M
mark
  • 定点数和浮点数的区别比较

mark

小结:

  • 尾数给出了一个小数,阶码指明了小数点要向前/向后移动多少位
  • 尾数M的数值部分的位数n反映了浮点数的精度
  • 阶码E反映了浮点数的表示范围以及小数点的实际位置

举个例子

mark

2. 浮点数尾数的规格化

  • 首先来看个问题
    • 尾数的最高位不是一个有效位,会造成精度的损失
mark
  • 解决问题的方案:
    • 规定尾数的最高位数值一定是个有效值
    • 左规:将尾数算数左移一位,阶码减一
    • 右规:将尾数算数右移一位,阶码加一
      • 右规:当使用双符号位的时候,同时有溢出发生时,可以进行挽救

举个例子:

mark

规格化的特点:

mark

小结:

mark

3. IEEE 754

3.1 IEEE 754 移码

  • 之前所说的移码:补码的基础上将符号位取反
    • 这里偏置值是128 = 2^(n-1)
mark
  • 移码的定义:移码 = 真值+偏置值
mark
  • IEEE 754 标准的移码
mark

mark

3.2 IEEE 754 浮点数表示

  • IEEE 754 标准的浮点数
    • 尾数采取隐藏位策略的原码表示
    • 阶码用移码表示的浮点数
      • 阶码的全0 和 全1 用作特殊用途
      • 阶码的真值 = 移码 - 偏置值

mark

举个例子:

mark


  • 将十进制转换为单精度浮点数

mark

  • 将单精度浮点数转换为十进制数

mark

3.3 IEEE 754 表示范围

  • 单精度浮点数表示范围

mark

  • 双精度浮点数表示范围

mark

  • 阶码全0 和 全1的作用

    • 阶码全0 : 可以表示比原来最小值还要小的数

    mark

    • 阶码全1 :可以表示比原来最大数还要大的数

mark

3.4 小结

  • 由浮点数如何确定真值?
    • 根据 ”某浮点数“ 确定数符,阶码,尾数
    • 确定尾数 1.M (注意补充最高的隐含位)
    • 确定阶码的真值 = 移码 - 偏置值(可将移码看作无符号数,用无符号数的值减去偏置值)
    • (-1)^s * 1.M * 2^(E - 偏置值)

mark

4. 浮点数的计算

  • 首先还是从10进制浮点数原理开始说起
    • 分为几个步骤
      • 对阶 : 小阶向大阶看齐
      • 尾数加减 :通常使用双符号位,拯救溢出
      • 规格化 : 左规和右规操作
      • 舍入
      • 判断溢出

mark

4.1 二进制浮点数计算

  • 二进制举个例子
    • 无需舍入的例子如下:
mark

image-20210428095730353

4.2 舍入的方法

  • 舍入的方式

    mark
    • 0 舍 1 入 法 : 当舍弃的数字是1的时候,给末尾的数字加1
    • 恒 置 1 法:无论舍弃的值为什么,把最后一位改为1
mark

5. 浮点数 强制类型转换

mark
  • 无损的转换类型(32 位 情况下)
1
2
3
4
5
6
7
8
char -> int -> long -> double
float -> double

## 注意 : 在64位的情况下 long -> double 有精度损失

1.
int -> float : int有效位32 float有效位24 会有精度的损失
float -> int : 可能会溢出也可能会有精度损失(int 没有小数部分)

6. 浮点数小结

mark

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信