超出有效位数的乘法实现
作者: ameya执行次数: 569
※ 本程序库由会员创建。本站不对其内容负责。
这里展示了一种将乘法结果存储在两个变量中,从而确保位数加倍的方法。为了便于说明,这里设置为10位,但即使是50位,也可以采用同样的思路。
源代码如下:
为了便于阅读,已省略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);
/* 虽然可能很难理解,
但只要注意“进行这些操作的最终目的只是为了‘保留有效数字’”,
相信就能看清其中的奥妙。 */
为了便于阅读,已省略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);
/* 虽然可能很难理解,
但只要注意“进行这些操作的最终目的只是为了‘保留有效数字’”,
相信就能看清其中的奥妙。 */
目前还没有关于此计算的用户评价。
在处理整数时,数值会被四舍五入到有效位数,这确实是个问题。
实际上,要精确计算出乘法的结果,需要两倍的有效位数。