證明tmult_ok的正確性

來源:互聯網
上載者:User

標籤:style   class   blog   http   color   com   

csapp page124. practice problem 2.35

/* Determine whether arguments can be multiplied without overflow */int tmult_ok(int x, int y){    int p = x*y;    /* Either x is zero, or dividing p by x gives y */    return !x || p/x == y;}

函數 tmult_ok 的功能是檢查兩個二補數相乘會不會溢出, 邏輯是,要麼 x 為零, 或者 乘積 p 除以 x 等於另一個乘數 y 的話,就說明不會溢出。

這題要求給出這個函數正確性的數學證明。首先證明當x=0這個情況的正確性。然後考慮w位的數字(w不等於0) 有 y, p, 和 q, 其中 p 是x, y執行了二補碼乘法後的結果, q 是 p/x 的值。

書中給出三條線索,分別給出這三條線索的證明即可證明這個函數的正確性。

  1. 證明: x和y的整數相乘結果可以被寫成 x * y = p + t*2^w 形式, 若且唯若 t != 0 的時候,p溢出。
  2. 證明: p 可以被寫成 p = x * q + r, 其中|r| < |x|.
  3. 證明: 若且唯若 r = t = 0 的時候 q = y.

答案是這麼證明的:

1.因為x,y都是w位二補碼錶示的數,所以他們的乘積最多要用2w位表示,因為:

  -2^(w-1) <= x, y <=2^(w-1) - 1 註:這是二補碼的取值範圍
所以 x*y 就要   大於等於 -2^(w-1) * (2^(w-1) - 1) 就等於 -2^(2*w - 1) + 2^(w - 1) 注: 其實就是Tmax*Tmin
                     小於等於 (-2^(w - 1))^2 就等於 2^(2*w - 2) 注: 其實就是Tmin*Tmin,可以證明Tmax^2 沒有 Tmin^2大

看見2的次方數是2w起跳的,就說明肯定得要2w位才能表示了。所以 x*y 理應是要用 2w 位表示的(但是2w位是溢出的,暫時不管),現在設 u 等於該乘積低w位的無符號形式,v 等於該乘積高w位的二補碼形式。
那麼,根據公式2.3 即二進位到二補碼的轉換公式可以得出 x*y = v*2^w + u 這個式子乍一看匪夷所思,怎麼能把一個位向量劈成兩半,前w位按二補碼算然後乘以2^w ,後w位按無符號算然後兩個部分加起來怎麼剛好就是x和y的乘積??
其實只要根據二進位轉二補碼的公式細心推倒,馬上就可以證明這個結論:

 

 

我們還知道 u = T2U(p) 這裡p是二補碼乘積,因為實際上不管乘積結果有沒有溢出,unsigned形式和tow‘s complement形式的乘積在w位上是一模一樣的,這點在數的2.18給出了證明。
所以根據公式T2U 得 u = pw-1 * 2^w + p, 把u 帶入之前的 x*y = v*2^w + u 這裡, 化簡可以得到: x*y = 2^w * (v + pw-1) + p, 此時我們設 t = v + pw-1,公式變為:x*y = t* 2^w + p

這裡我們就可以看出,若且唯若 t = 0 的時候, x*y 才等於p,t 不等於 0 的時候乘積是溢出的。到這裡證明了上面的第1條。

2.因為無論 x*y 的值 p 有沒有溢出,總之它是個整數,那麼只要 p 是個整數,它除以一個非零整數 x 必然會得到一個商(q)和一個餘數(r) 使得 p = x * q + r 其中 |r| < |x|
這裡取絕對值是因為r 和 x 的符號可能不一樣,比如 -7 / 2 得 -3 餘 -1, |-1| < |2|。 這裡證明了第2條。

3. 如果 q = y 根據 p = x*q+r 得出 p = x*y+r 其中 x*y = t * 2^w + p 所以 p = t*2^w + p + r, 兩邊消去 p 以後得到 t*2^w = -r 要讓這個等式成立,有兩種情況,要麼等號兩邊值相等,要麼兩邊都為零。
在第2條的證明中,我們得出 |r| < |x|, 而x是二補碼,所以絕對值的最大值是 2^w 所以 |r| < 2^w, 回到這裡,等式左邊出現了2^w 而 r 要比2^w 小,可見其值必不相等,則必須是為零的情況。所以必須 r = t = 0

根據第1條證明,我們知道要想乘積不溢出,t 必須為 0, 根據第三條,若且唯若 t 為 0 的時候 p / x = y 用程式表示就是 (!x || p / x == q) 這個邏輯被證明是正確的。

這樣3也證明了,再看x=0的情況,x等於零的時候乘積為零肯定不會溢出嘛,所以這個程式是正確可靠的。證畢。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.