本單元重點回顧
小數用
double:約 15 \sim 16 位有效數字;float精度不足,競程不用;long double是精度救兵。cout 預設輸出:最多 6 位有效數字,太大或太小改科學記號(
ae+b就是 a \times 10^b),多餘的零不印。輸出格式自己控制:
fixed << setprecision(k)固定小數點後 k 位;沒有fixed的setprecision是「k 位有效數字」——兩個一定成對寫。混合運算看兩邊:兩個整數相除還是整數除法;要小數就先讓一邊變浮點(
(double)a / b或1.0 * a / b),事後補救來不及。浮點數=二進位的科學記號:正負號+指數+尾數三段。小數點靠指數「浮動」,精度由尾數決定。
誤差的兩個來源:多數小數(如 0.1)存進去就不準;運算逐步累積。超過 2^{53}(約 9 \times 10^{15})的整數,double 也存不準。
浮點數不用
==:用 EPS——abs(a - b) < EPS視為相等;「明顯小於」寫a < b - EPS。誤差要求看得懂:絕對誤差 |v - ans|、相對誤差 \frac{|v-ans|}{|ans|};應對方式是把位數印好印滿(
setprecision(12))。cmath 工具箱:
sqrt、cbrt、floor(向下)、ceil(向上)、round(四捨五入,回傳浮點數);pow又慢又不準,整數次方用連乘。轉型是向零捨去:
(int)3.8得 3、(int)-2.9得 -2——負數時和floor分家;四捨五入成整數寫(long long)round(x)。能用整數就用整數:大整數判斷、上取整
(A+B-1)/B、分數交叉相乘都有純整數寫法;sqrt這類必須浮點的,拿近似值後用整數修正。