有符号整数范围
最高位符号位,正数为 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^381 11111110 11111111111111111111111- 指数:
254 - 127 = 127 - 尾数:
1.11111111111111111111111 = 2 - 2^-23 ≈ -(2 × 2^127) ≈ -3.4 × 10^38
负正规数(最接近 0)
-1.17549435 × 10^-381 00000001 00000000000000000000000- 指数:
1 - 127 = -126 - 尾数:
1.0 -1 × 2^-126
负非正规数(最接近 0)
-1.40129846 × 10^-451 00000000 00000000000000000000001- 指数:
00000000 - 尾数:
00000000000000000000001
-0/+0
-0 = 1 00000000 00000000000000000000000
+0 = 0 00000000 00000000000000000000000最小正非正规数(denormal)
1.40129846 × 10^-450 00000000 00000000000000000000001- 指数:
00000000 - 尾数:
00000000000000000000001
最小正数正规数(normalized)
1.17549435 × 10^-380 00000001 00000000000000000000000- 指数:
1 - 127 = -126 - 尾数:
1.0 1 × 2^-126
最大正数
3.4028235 × 10^380 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 | 适用场景 |
|---|---|---|---|---|---|---|---|
| FP32 | 32 | 1 | 8 | 23 | |||
| TF32 | 19 | 1 | 8 | 10 | |||
| FP16 | 16 | 1 | 5 | 10 | |||
| BF16 | 16 | 1 | 8 | 7 | |||
| INT32 | 32 | 1 | 1 | ||||
| INT16 | 16 | 1 | 1 | ||||
| FP8(E5M2) | 8 | , +/-inf, nan | 1 | 5 | 2 | ||
| fp8(E4M3) | 8 | , nan | 1 | 4 | 3 | ||
| FP4(E2M1) | 4 | , 无 inf/nan | 1 | 2 | 1 | ||
| INT8 | 8 | 1 | 1 |
浮点数存储结构
浮点数的真值表示为: Value = (-1)^S × (1 + M) × 2^(E - Bias)
大数吃小数的原因:浮点数计算对阶过程导致
浮点数运算步骤:
对阶→尾数求和→规格化
- 对阶:
为什么要对阶:就像十进制的科学记数法一样,你要计算 ,必须先让它们的指数一样,才能把前面的有效数字相加
对阶过程精度损失:
假设一个浮点数的真实值为 V,尾数为 M,阶码为 E:
在对阶过程中,如果你把较小的阶码 E 加上了 ΔE(使其等于较大的那个阶码),为了保证浮点数的总值 V 依然不变,你的尾数 M 就必须缩小相应的倍数:
乘以 (即除以 )的物理操作,就是将尾数的二进制位向右平移 位,这个过程就右尾数精度丢失了 - 尾数求和
- 规格化
尽可能的避免方法
先小数计算,最后结果再与大数计算