72 lines
1.7 KiB
JavaScript
72 lines
1.7 KiB
JavaScript
/**
|
|
* @import { Num } from "./num.js"
|
|
*/
|
|
import { kBuffer } from "./num.js";
|
|
import { add16B } from "./add/16B.js"
|
|
import { add8B } from "./add/8B.js";
|
|
import { add2B } from "./add/2B.js";
|
|
import { add10B } from "./add/10B.js";
|
|
import { size16, size8, size2, size10 } from "./alloc.js"
|
|
|
|
/**
|
|
* @param { Num } a
|
|
* @param { Num } b
|
|
*/
|
|
export function add16(a, b) {
|
|
let carry = false;
|
|
const { [kBuffer]: b1 } = a;
|
|
const { [kBuffer]: b2 } = b;
|
|
|
|
for (let i = 0; i < size16; i++) ([b1[i], carry] = add16B(b1[i], b2[i], carry));
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
* @param { Num } b
|
|
*/
|
|
export function add8(a, b) {
|
|
let carry = false;
|
|
const { [kBuffer]: b1 } = a;
|
|
const { [kBuffer]: b2 } = b;
|
|
|
|
for (let i = 0; i < size8; i++) ([b1[i], carry] = add8B(b1[i], b2[i], carry));
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
* @param { Num } b
|
|
*/
|
|
export function add2(a, b) {
|
|
let carry = false;
|
|
const { [kBuffer]: b1 } = a;
|
|
const { [kBuffer]: b2 } = b;
|
|
|
|
for (let i = 0; i < size2; i++) ([b1[i], carry] = add2B(b1[i], b2[i], carry));
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
* @param { Num } b
|
|
*/
|
|
export function add10(a, b) {
|
|
let carry = false;
|
|
const { [kBuffer]: b1 } = a;
|
|
const { [kBuffer]: b2 } = b;
|
|
|
|
for (let i = 0; i < size10; i++) ([b1[i], carry] = add10B(b1[i], b2[i], carry));
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
* @param { Num } b
|
|
*/
|
|
export function add(a, b) {
|
|
if (a.radix !== b.radix) throw new Error(`numbers must have same radix`);
|
|
switch (a.radix) {
|
|
case 2: return add2(a, b);
|
|
case 8: return add8(a, b);
|
|
case 16: return add16(a, b);
|
|
case 10: return add10(a, b);
|
|
default: throw new Error(`unsupported radix (${a.radix})`);
|
|
}
|
|
} |