Matematicheskiye_obosnovani.../lab1/add.js
2025-01-29 16:04:11 +03:00

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})`);
}
}