Lazy loaded image
计算机体系结构
🥴浮点数
Words 1788Read Time 5 min
2025-3-19
2025-4-6
type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态

浮点数的表示

浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数的位置根据需要而浮动。这样既扩大了数的表示范围,又保持了数的有效精确度。
  1. 浮点数的表示格式
    1. N = × M ×
      S取值为0或者1,用来决定浮点数的符号;M是一个二进制定点小数,称为尾数,一般用定点原码小数表示;E为一个二进制定点整数,称为阶码或指数,用移码表示。R是基数(隐含),可以约定为2、4、16等。
      即浮点数由符号、尾数和阶码三部分组成。
      notion image
  1. 浮点数的表示范围
    1. 浮点数和原码相同,都是关于原点对称的。
      notion image
      若运算结果大于最大正数时称为上溢出,小于绝对值最大负数时称为负上溢,两者统称为上溢。当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢。两者统称下溢。
  1. 浮点数规格化
    1. 通过调整一个非规格化浮点数的尾数和阶码的大小,使非零浮点数在尾数定点最高位上保证是一个有效值。
      左规:当运算结果的尾数的最高数位不是有效位,即出现士0.0...0×...的形式时,需要进行左规。左规时,尾数每左移一位、阶码减1(基数为2时)。左规可能要进行多次
      右规:当运算结果的尾数的有效位进到小数点前面时,需要进行右规,右规只需进行一次。将尾数右移一位、阶码加1(基数为2时)。右规时,阶码增加可能导致溢出。
  1. IEEE 754标准
    1. 此标准下的浮点数格式如下:
      notion image
notion image
单精度格式中包含1为符号s、8位阶码e和32位尾数f;双精度格式包括一位符号位s、11位阶码 e和52为尾数f。基数隐含为2。
对于规格化的二进制浮点数,尾数的最高位总是1.为了能使尾数多一位有效位,将这个1隐藏,称为隐藏位,因此23位尾数实际表示了24位有效数字。
💡
在IEEE 754规定隐藏位1的位置在小数点之前 如: ,将其规格化后为 1.1× ,其中整数部分的1将不存储在23位尾数内。
规格化单精度浮点数的阶码e的表示范围位1~254(8位);规格化双精度浮点数的阶码e的取值范围为1~2046(11位)。
阶码全为0或全为1的特殊意义:
notion image
notion image
  1. 全0阶码全0尾数:+0/-0。零的符号却决于符号s,一般情况下两者相等。
  1. 全1阶码全0尾数:+∞/-∞
  1. 全1阶码非0尾数:NAN。无定义,为非数。
  1. 全0阶码非0尾数:非规格化数
实数与IEEE 754 单精度数的相互转化:
notion image
notion image
  1. 定点、浮点表示的区别
    1. 数字表示范围
      1. 浮点数表示范围远大于定点表示法
    2. 精度
      1. 在相同字长下,浮点数虽然扩大了数的表示范围,但是精度降低了。
    3. 数的运算
      1. 浮点数包括阶码和尾数两部分。运算时不仅要做尾数运算,还要做阶码运算,而且运算结果要规格化。
    4. 溢出问题
      1. 浮点数运算是阶码运算和尾数运算分开进行,浮点数加减运算分为:
      2. 对阶:使两个操作数定点小数点位置对其,即使得两个数的阶码相等。
      3. 尾数相减:将对阶后的尾数按定点原码小数的加减运算规则进行运算
      4. 尾数规格化:尾数相加减后可能得到多种结果,如:左规和右规划。
      5. 舍入:在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将移出的部分低位保留下来,参加中间过程的运算,最后再将运算结果进行舍入,还原表示成IEEE754格式。
        1. 有如下四种舍入模式:
          • 就近舍入:舍入为最近的可表示数。当运算结果正好在两个可表示数的中间时,选择结果为偶数。
            • 如:1.2400×10²+ 0.0050×10²= 1.2450×10²
          • 正向舍入:朝+∞方向舍入,即取右边最近的可表示数。
          • 负向舍入:朝-∞方向舍入
          • 截断法:直接阶段所需位数,丢弃后面的所有位。
      6. 溢出判断
        1. 若一个正指数超过了最大允许值(127或1023),则发生指数上溢,产生异常。若一个负指数超过了最小允许值(-149或-1074),则发生指数下溢,通常把结果按机器零处理。
          • 右规和尾数舍入。数值很大的尾数舍入时,可能因为末位加1而发生尾数溢出,此时需要通过右规来调整尾数和阶码。右规时阶码加1,导致阶码增大,因此需要判断是否发生了指数上溢。当调整前的阶码为11111110时,加1后,会变成111111而发生指数上溢。
          • 左规。左规时阶码减1,导致阶码减小,因此需要判断是否发生了指数下溢。其判断规与指数上溢类似,左规一次,阶码减1,然后判断阶码是否为全0来确定指数是否下溢。由此可见,浮点数的溢出并不是以尾数溢出来判断的,尾数溢出可以通过右规操作得到纠正。

C语言中的浮点数类型

C语言中的float型和double型分别对应于IEEE754单精度浮点数和双精度浮点数。longdouble型对应于扩展双精度浮点数,但longdouble型的长度和格式随编译器和处理器类型的不同而有所不同。
  1. int 转为 float ,不会发生溢出,但是会影响精度
  1. int 或 float 转 double时,能够保留精确度
  1. double 转 float ,进行大数转换时可能会发生溢出。
  1. float 或 double 转 int ,int 无小数位,发生截断进行舍入,可能会溢出。
 
上一篇
进程API
下一篇
分段