您正在使用新版介面(Beta)。返回原版介面

本頁面由機器翻譯自動翻譯而成,翻譯內容可能存在不準確之處,敬請見諒。

keisan服務於日常生活和工作的高精度計算網站

超出有效位數的乘法實作

作者: ameya執行次數: 569

※ 本程式庫由會員建立。本站不對其內容負責。

管理書籤
這涉及程式設計方面的話題。
談到整數時,數值會因有效位數而被四捨五入,這確實是個問題呢。
原本,要精確計算出乘法的結果,需要兩倍的有效位數。
此處展示了一種將乘法結果儲存至兩個變數,以確保位數加倍的方法。此處為說明之故設定為10位數,但即使設定為50位數,亦可採用相同的思路。
A
最多 10 位數的正整數
B
最多 10 位數的正整數
原始碼如下所示
因顯示較難辨識,故省略了 print 指令的行。

/* keta 是表示位數的保留字 */
ketahalf = keta / 2;   /* ← 取位數的一半,用於分割 */
mxall = 10 ^ keta;    /* ← 顯示高位數時採用指數表示法 */
mxhalf = 10 ^ ketahalf; /* ← 為了避免此情況,在此進行除法運算。*/

/* 輸入為 A 和 B,分別分割為 ah,a 和 bh,b */
ah = rounddown(A, -ketahalf);
bh = rounddown(B, -ketahalf);
a = A - ah;
b = B - bh;

/* 將數值分成兩半,是為了透過乘法將有效數字控制在位數範圍內 */

/* 高位與高位、低位與低位的乘法 */
cch = ah * bh;
cc = a * b;

/* 交叉相乘 */
m1 = ah * b;
m2 = bh * a;

/* 將交叉相乘的結果分別分割 */
mh1 = rounddown(m1, -keta);
m1 = m1 - mh1;
mh2 = rounddown(m2, -keta);
m2 = m2 - mh2;

/* 交叉乘法結果的相加 */
th = mh1 + mh2;

/* 由於此處低位數的加法可能產生進位,因此採用特殊技巧 */
tt = (m1 - 5E+9) + (m2 - 5E+9);
if (tt < 0) {
  tt = tt + 1E+10;
} else {
  th = th + 1E+10;
}

/* 將最初的高位與低位各自的乘積相加 */
cch = cch + th;

/* 此處低位也有可能發生進位 */
cc = (cc - 5E+9) + (tt - 5E+9);
if (cc < 0) {
  cc = cc + 1E+10;
} else {
  cch = cch + 1E+10;
}

/* 顯示結果。*/
println(-11, cch / mxall, cc);

/* 雖然可能很難理解,
 但只要注意「到目前為止所做的種種操作,
 終究是為了『保留有效數字』」這一點,
 相信就能看清其中的奧妙。 */

目前還沒有關於此計算的用戶評價。