有符号整数范围

最高位符号位,正数为 0,负数为 1。对于计算机,补码才是数,正数的补码是本身,负数的补码是取反 + 1。

int8 举例

  • 正数:00000000 ~ 01111111 最大值 01111111 = 127
  • 负数:10000000 ~ 11111111 最小值 10000000 补码 -1 为 01111111 取反为 10000000 所以真实值为 -128(负数 1 越多数字越大,因为取反之后为 0,越接近 0)

浮点数范围

float32 举例

  • 最大:+3.4028235 × 10^38
  • 最小:-3.4028235 × 10^38
  • 是对称的

为什么要有非正规数

如果只有正规数,数轴会出现一个断层。正规数最小值是 1.17549435 × 10^-38,但再小就直接变成 0,所以需要非正规数把 0 附近补齐。

←────────────────────────────────────────────────────────────────────────────────────────→
-∞      最小负数        负正规数(最近 0)   负非正规数(最近 0)   -0   +0   最小正非正规数   最小正正规数        最大正数      +∞
 |          |                |                  |             |    |           |                |               |         |
-∞     -3.4e38         -1.175e-38          -1.4e-45          0    0       1.4e-45         1.175e-38        3.4e38      +∞

最小负数

  • -3.4028235 × 10^38
  • 1 11111110 11111111111111111111111
  • 指数:254 - 127 = 127
  • 尾数:1.11111111111111111111111 = 2 - 2^-23
  • ≈ -(2 × 2^127) ≈ -3.4 × 10^38

负正规数(最接近 0

  • -1.17549435 × 10^-38
  • 1 00000001 00000000000000000000000
  • 指数:1 - 127 = -126
  • 尾数:1.0
  • -1 × 2^-126

负非正规数(最接近 0

  • -1.40129846 × 10^-45
  • 1 00000000 00000000000000000000001
  • 指数:00000000
  • 尾数:00000000000000000000001

-0/+0

-0 = 1 00000000 00000000000000000000000
+0 = 0 00000000 00000000000000000000000

最小正非正规数(denormal)

  • 1.40129846 × 10^-45
  • 0 00000000 00000000000000000000001
  • 指数:00000000
  • 尾数:00000000000000000000001

最小正数正规数(normalized)

  • 1.17549435 × 10^-38
  • 0 00000001 00000000000000000000000
  • 指数:1 - 127 = -126
  • 尾数:1.0
  • 1 × 2^-126

最大正数

  • 3.4028235 × 10^38
  • 0 11111110 11111111111111111111111
  • 指数:254 - 127 = 127
  • 尾数:1.11111111111111111111111 = 2 - 2^-23
  • ≈ 2 × 2^127 ≈ 3.4 × 10^38

inf / -inf / nan

inf
0 11111111 00000000000000000000000
 
-inf
1 11111111 00000000000000000000000
 
nan
0 11111111 10000000000000000000000

常用数据类型

数据类型bits数值范围数值精度符号位S指数位E尾数位M适用场景
FP32321823
TF32191810
FP16161510
BF1616187
INT323211
INT161611
FP8(E5M2)8, +/-inf, nan152
fp8(E4M3)8, nan143
FP4(E2M1)4, 无 inf/nan121
INT8811

浮点数存储结构

浮点数的真值表示为: Value = (-1)^S × (1 + M) × 2^(E - Bias)

大数吃小数的原因:浮点数计算对阶过程导致

浮点数运算步骤:

对阶尾数求和规格化

  1. 对阶:
    为什么要对阶:就像十进制的科学记数法一样,你要计算 ,必须先让它们的指数一样,才能把前面的有效数字相加
    对阶过程精度损失:
    假设一个浮点数的真实值为 V,尾数为 M,阶码为 E:
    在对阶过程中,如果你把较小的阶码 E 加上了 ΔE(使其等于较大的那个阶码),为了保证浮点数的总值 V 依然不变,你的尾数 M 就必须缩小相应的倍数:

    乘以 (即除以 )的物理操作,就是将尾数的二进制位向右平移 位,这个过程就右尾数精度丢失了
  2. 尾数求和
  3. 规格化

尽可能的避免方法

先小数计算,最后结果再与大数计算