動機

複習浮點數

IEEE 754

  1. (dec) 8.5
  2. (轉成bin) 1000.1
  3. (移到只剩下一個1) 1.0001 * 2^3
  4. 開始填回去
    • sign: 0 (正的)
    • exponent: 127+3 = 130 = 10000010
      • 以127為分界點,IEEE 547定義
        • exponent放127以及fraction為0時整個是0
    • fraction: 把小數點右邊的直接填上去

誤差

就是後面的fraction,如果說遇到一個沒辦法被2整除的小數,就會一直產生新的數字,自然就不夠放,也自然就會出現奇怪的結果

雙精度?

Precision (準確度) 和 Accuracy (精密度)

Accuracy: 出現的資料是對的 Precision: 出現的資料夠多 (表現出的格子數夠多)

Accurate && Precise 3.14159 Accurate && Inprecise 3.14 Inaccurate && Precise 3.14128 Inaccurate && Inprecise 3.22

overflow

整數有overflow,float也會!!

(1e20 * 1e20) * 1e20 為 +INF 1e20 * (1e20 * 1e-20) 為 1e20 1e20 * (1e20 - 1e20) 為 0.0 1e20 * 1e20 - 1e20 * 1e20 為 NaN

補數

什麼是負數? 有負號的數字

但有負號不好表示與運算,所以重新定義 a+b = 0 a與b互為對方的負數,或是補數(相加之後就會滿,利用有儲存範圍的限制這一點)

假設用1byte去存 1補數: a+b = 1111 * 這樣會有+0與-0 !! 2補數: a+b = (1)0000

怎麼算 1補數: NOT 2補數: NOT+1

Ref

IEEE-754 與浮點數運算 你所不知道的 C 語言:數值系統篇 從 IEEE 754 標準來看為什麼浮點誤差是無法避免的 浮點數的美麗與哀愁 (裡面的case都很有趣)