普考申論題
105年
[資訊處理] 程式設計概要
第 一 題
📖 題組:
三、觀察以下 C++語言之程式,試回答下列問題: int main(){ double a = 0.2 * 0.2, b = 0.04; if(a == b){ cout << "a = b" << endl; } else if(a < b){ cout << "a < b" << endl; } else{ cout << "a > b" << endl; } cout << a << endl << b << endl; }
三、觀察以下 C++語言之程式,試回答下列問題: int main(){ double a = 0.2 * 0.2, b = 0.04; if(a == b){ cout << "a = b" << endl; } else if(a < b){ cout << "a < b" << endl; } else{ cout << "a > b" << endl; } cout << a << endl << b << endl; }
📝 此題為申論題,共 2 小題
小題 (一)
試問該程式之輸出為何?(10 分)
思路引導 VIP
本題核心考點為「浮點數的精度誤差」。看到浮點數(小數)直接進行等號比較時,必須警覺二進位無法精確表示 0.2 等十進位小數,這會導致乘法運算後產生微小的位元誤差,最後再結合 cout 的預設輸出精度即可推斷出正確結果。
小題 (二)
根據上題(一)之輸出為 a = b、a < b 或 a > b,請說明其原因?(15 分)
思路引導 VIP
看到浮點數(double/float)的四則運算與等號判斷(==),應立刻聯想到「IEEE 754 浮點數精確度」與「二進位儲存誤差」問題。解題關鍵在於指出十進位小數轉二進位時產生的截斷誤差,以及運算後誤差累積的結果,並點出浮點數不可直接使用 '==' 比較的實務觀念。