浮點數運算與數值表示

雙精度

當人們說某計算是「用 double 做的」,意思是它使用 64 位元浮點數,這是科學計算的主力格式。之所以叫雙精度,是因為它佔用的儲存空間是舊式 32 位元單精度的兩倍,而這多出的空間既買到更多有效數字,也買到遠更寬廣的範圍。它是大多數語言預設的浮點型別,也是幾乎所有數值函式庫所假定的格式。

一個 IEEE 754 binary64 數打包了 1 個符號位元、11 個指數位元(偏移 1023)、52 個儲存的小數位元。加上隱含的領先 1,即 53 個尾數位元,給出約 15 至 17 位十進位有效數字。其指數範圍讓它能表示約 2.2 * 10^(-308) 到約 1.8 * 10^308 的數值大小(次正規數可達更小)。其單位捨入為 u = 2^(-53) ~ 1.1 * 10^(-16),所以單一捨入運算準確到約 16 位數。相較之下,單精度(binary32)只有約 7 位數,u = 2^(-24) ~ 6 * 10^(-8)。

double 是舒適的預設,因為 16 位數留下了寬裕的餘地,讓捨入誤差在毀掉你只在意到約 6 位數的答案之前盡情累積。但它並非魔法:一個條件數接近 10^8 的病態問題,無論你的程式多穩定,仍會損失約 8 位(共 16 位中),而夠長或夠粗心的計算也能耗盡其餘的位數。同時,單精度(以及半精度 FP16/bfloat16)正在機器學習與 GPU 上捲土重來,因為在那裡速度與記憶體頻寬比最後幾位數更重要。

把十億零一 1000000001.0 存成 double 是精確的,還綽綽有餘;但在單精度中它會捨入成 1000000000.0,因為單精度的 24 個尾數位元在那個量級下無法分辨一個單位的步距(那裡的間隔是 64)。這正是為什麼把許多值相加、或以秒為單位處理時間戳,通常都需要 double。

double 的約 16 位數對比單精度的約 7 位數——這正是它咬人的量級。

雙精度並非單精度的「兩倍精確」;它的尾數位元多於兩倍(53 對 24),所以約多出 9 位十進位數字——而且還有大得多的指數範圍,不只是更細的步距。

又称
binary64FP64double倍精度