IEEE 754 标准数值类型及分类

整数 Integer

整数是没有小数部分的值, 在计算机内通常有两种表示方式:

  • 有符号整数: 可以表示正数和负数, 最常用的是二补码表示. 例如 8 位二进制的范围为[-2^7, 2^7-1]
  • 无符号整数: 仅表示非负数, 8 位二进制的范围为 [0, 2^8-1]

其中补码(Two’s Complement)用于表示负数

  • 正数补码与原码相同
  • 负数的补码 = 该数绝对值的二进制取反 + 1

通过补码, 可以使得加减运算统一, 溢出检测更加简单

浮点数 Floating-point

浮点数用于表示带小数的实数, 尤其适合科学计算和近似表示很大或很小的数值. IEEE 754 定义了浮点数的标准格式, 类似科学计数法:

value = (-1)^(sign) x mantissa x 2^(exponent)

浮点数由三部分组成:

  1. 符号位 sign: 0/1代表正负
  2. 阶码 exponent: 通常使用偏移表示法
  3. 尾数 fraction/mantissa: 小数部分

常见浮点数类型:

  • 单精度 float32: 1 位符号 + 8 位阶码 + 23 位尾数
  • 双精度 float64: 1 位符号 + 11 位阶码 + 52 位尾数

浮点数的分类 Categories

以 64 精度为例

部分位数描述
符号位(sign)10 表示正数,1 表示负数
阶码(exponent)11偏移量(bias)为 1023,表示数值的量级
尾数(fraction / mantissa)52有效数字,不包括隐藏位

浮点数的表示公式:

value = (-1)^sign x (1 + fraction) x 2^(exponent - bias)
  • 正常数 Normalized numbers

    • 阶码 exponent: 不全为0, 也不全为1, [1, 2^11-2]
    • 尾数 fraction: 隐含1, [0, 1 - 2^-52], (52位全1 位 1 - 2^-52)
    value = (-1)^sign x (1 + fraction) x 2^(exponent - 1023)
    

    其中, bias = 2^(exponent - 1) - 1, 这里为 1023

    • 最大正常数: 阶码最大为 1024*2-2 = 2046, 尾数全为1 1-2^-52, 即 ( 1 + (1 - 2^-52) ) x 2^(2026-1023)
    • 最小正常数: 阶码最小位 1, 尾数全为0, 即 ( 1 + 0 ) x 2^(1-1023)
  • 非正规数 Subnormal numbers / Denormalized numbers

    • 阶码 exponent: 全0
    • 尾数 fraction: [0, 1-2^-52], 没有隐藏位1
    value = (-1)^sign x (fraction) x 2^(1 - bias)
    

    非正规数指数紧接最小正常数, 使非正规数数值连续接近零

    注意: 非正规数的指数并不是阶码减 bias 的直接结果(0−1023 = −1023), 而是约定使用最小正常数指数 E_min = −1022. 这样可以让非正规数顺接正常数, 形成连续的可表示范围, 并支持渐进下溢.

    • 最大非正规数: 阶码为0, 尾数全为1, 即 ( 1 - 2^-52 ) x 2^(-1022)
    • 最小非正规数: 阶码位0, 尾数最低位为1, 其他为0, 即 ( 2^-52 x 2^(-1022) )
  • 零 0

    • 符号 sign: 0/1 正负零
    • 阶码 exponent: 0
    • 尾数 fraction: 0
  • 无穷 infinity

    • 符号sign: 0/1 正负无穷
    • 阶码 exponent: 2047 (全1)
    • 尾数 fraction: 0
  • 非数值 NaN

    • 阶码 exponent: 2047 (全1)
    • 尾数 fraction != 0

    表示未定义或非法运算, 如 0/0

类别 (categories)符号位 (sign)阶码 (exponent)尾数 (fraction / mantissa)描述
正常数0 或 1[1, 2046]1.f 范围: [1.0, 2-ε)阶码非全0且非全1, 尾数隐含最高位1
非正规数0 或 1全 00.f 范围: (0, 1.0-ε]阶码全0, 尾数非全0, 无隐藏位1, 接近0
±00 或 1全 0全 0阶码全0, 尾数全0
±∞0 或 1全 1 [2047]全 0阶码全1, 尾数全0
NaN (qNaN / sNaN)0 或 1全 1 [2047]非全 0阶码全1, 尾数非全0, 表示无效或未定义运算

注意: 非正规数的阶码虽然为全0, 但是计算时约定为 1-bias = 1-1023 = -1022, 而不是像正规数那样 exponent - bias