IEEE 754(IEEE 754)不只定義一般浮點數,也特別規範了特殊值,用來處理溢位、非法運算等情況。最重要的就是:
- Infinity(±∞)
- NaN(Not a Number)
一、先回顧浮點數結構
以常見的 double(64-bit) 為例:[ 符號位 | 指數位 | 尾數位 ]
1bit 11bit 52bit
二、Infinity(無限大)
表示規則
指數 = 全 1(111...111)
尾數 = 全 0
正負 Infinity
類型符號位指數尾數+∞0全10-∞1全10
範例
float('inf') # +∞
float('-inf') # -∞
什麼情況會產生 Infinity?
1️⃣ 數值溢位(overflow)
1e308 * 10 → inf
2️⃣ 除以 0
1.0 / 0.0 → inf
-1.0 / 0.0 → -inf
Infinity 的運算規則
∞ + 1 = ∞
∞ × 2 = ∞
∞ - ∞ = NaN(不確定)
三、NaN(Not a Number)
👉 表示「沒有定義的結果」
表示規則
指數 = 全 1
尾數 ≠ 0(至少一個 bit 是 1)
範例
float('nan')
什麼情況會產生 NaN?
1️⃣ 不合法運算
0.0 / 0.0 → NaN
∞ - ∞ → NaN
2️⃣ 負數開根號
sqrt(-1) → NaN
3️⃣ 未定義操作
log(-1)
四、NaN 的特殊性(非常重要)
1️⃣ NaN 不等於任何數(包括自己)
nan == nan → False
👉 正確判斷方式:
import math
math.isnan(x)
2️⃣ NaN 會「傳染」
NaN + 1 = NaN
NaN × 100 = NaN
👉 一旦出現,後面幾乎全壞
3️⃣ 有兩種 NaN(進階)

五、特殊值總整理(最重要表)

六、為什麼要設計這些特殊值?
如果沒有 Infinity / NaN:
👉 程式會直接崩潰(例外中斷)
但有了 IEEE 754:
👉 可以「繼續運算」,只是結果標記為特殊值
七、和 AI / GPU 的關係(關鍵)
在 NVIDIA GPU / AI 訓練中:
1️⃣ NaN 是訓練崩潰的警訊
loss = NaN → 模型壞掉
原因可能是:
- 梯度爆炸
- learning rate 太大
2️⃣ Infinity 代表 overflow
weight = inf
👉 常見於:
- FP16 / FP8 訓練不穩
3️⃣ 解法
- gradient clipping
- loss scaling
- normalization
八、直觀理解
👉 可以這樣想:

九、一句話總結
👉 IEEE 754 用「指數全1」來標記異常世界:尾數=0是∞,尾數≠0是NaN



















