2020年1月13日 星期一

1/3*3 問題

題目:
int main(void)
{
    float a, b;
    a = 1.0f / 3.0f;
    b = a * 3.0f;
    return 0;
}
For the above sample code, would the value of 'b' equal to one? Please justify your answer and explain.

先看執行結果:
再回過頭思考程式碼的部分。
a=1.0f/3.0f
所以a=0.333333,那麼乘三倍後應該會是0.999999,怎麼又變為1了呢?
有一個重要的點就是:電腦不是以10進位的方式去儲存、運算數字,而是以二進位的方式。在計算機概論裡也有簡單提過概念流程。基本上用二進位去存十進位的數,數字是沒有辦法被精確的紀錄的,必定會產生誤差。
再來看看下圖:

以固定位數到小數點第二十位,會發現除了預設的小數後六位數以後的數值就不是原本所想像的0.3333333333333........了。
而由於預設是小數點後六位才被四捨五入印出來,一開始才會認為跟想像的一樣,也因此這個a*3倍確實也就回到1了!
參考文章:

沒有留言:

張貼留言