目錄
為什麼我的 C 大精度加法的進位傳播不正確?
Dec 07, 2024 pm 01:30 PM大精度數學中的進位傳播
在C 大型精度類中,您會遇到一個問題,即添加0xffffffff 和0x04 結果為0xffff0003,而不是預期的0x0100000003。這個問題是由於不正確的進位傳播所造成的。
為了理解這個問題,讓我們檢查一下大數相加時的溢位。當新增兩個無符號位元組(或代碼中的無符號短整型)並且結果超過最大值 (255) 時,進位標誌將設為 1。此進位應傳播到下一個字節,表示結果應增加1.
在您的程式碼中,當兩個位元組之和溢位(255)時,您正確設定了進位標誌。然而,後續行沒有正確傳播進位。這是有問題的程式碼:
if (i < lhs.nbytes) { if (ret.data[i].data == 255 && ret.data[i + 1].carry == 1) increment(&trhs, i + 1); ret.data[i].data += ret.data[i + 1].carry; }
登入後複製
問題1:
increment(&trhs, i 1) 語句只在ret.data[ 時遞增trhs[i 1] i].data == 255 和ret.data[i 1].carry == 1。但是,進位無論 ret.data[i].data 的值如何,都應該發生傳播。
問題2:
ret.data[i ].data = ret.data[i 1].carry 語句將進位加到ret.data[i] .data,但這是不正確的。在將結果儲存到 ret.data[i].data 之前,應將進位加入結果。
解決方案:
要修復進位傳播,請執行以下操作變更:
if (i < lhs.nbytes) { ret.data[i].data += ret.data[i + 1].carry; if (ret.data[i].data > 255) { increment(&trhs, i + 1); ret.data[i].data -= 256; // Subtract 256 to adjust for overflow } }
登入後複製
這些變更可確保進位始終正確傳播。當兩個位元組總和超過 255 時,會從 ret.data[i].data 中減去 256 以調整溢位。
以上是為什麼我的 C 大精度加法的進位傳播不正確?的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章
擊敗分裂小說需要多長時間?
3 週前
By DDD
倉庫:如何復興隊友
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前
By 尊渡假赌尊渡假赌尊渡假赌
公眾號網頁更新緩存難題:如何避免版本更新後舊緩存影響用戶體驗?
3 週前
By 王林

熱門文章標籤

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)