aureooms-js-integer
Version:
integer code bricks for JavaScript
101 lines (70 loc) • 1.84 kB
JavaScript
import test from 'ava' ;
import { randint } from "aureooms-js-random" ;
import * as integer from '../../../src' ;
var runtest = function(name, n, mul53_t, hb, lb, r, calloc){
test(`${name} ${r}`, t => {
var i, x, y, z, a, b, c, d, v, w;
var mul53 = mul53_t(r);
for (i = 0; i < n; ++i) {
x = randint(0, r);
y = randint(0, r);
z = x * y;
// 0 BLOCK
a = calloc(1);
b = calloc(1);
a[0] = x;
b[0] = y;
c = calloc(2);
d = calloc(2);
mul53(a, 0, 1, b, 0, 1, c, 0, 0);
t.deepEqual(c, d, "c zero check 1");
c = calloc(2);
d = calloc(2);
mul53(a, 0, 0, b, 0, 1, c, 0, 2);
t.deepEqual(c, d, "c zero check 2");
c = calloc(2);
d = calloc(2);
mul53(a, 0, 1, b, 1, 1, c, 0, 2);
t.deepEqual(c, d, "c zero check 3");
// 1 BLOCK
a = calloc(1);
b = calloc(1);
c = calloc(2);
a[0] = x;
b[0] = y;
mul53(a, 0, 1, b, 0, 1, c, 0, 1);
v = c[0];
mul53(a, 0, 1, b, 0, 1, c, 1, 2);
w = c[1];
t.deepEqual(v, w, "index independence check");
t.deepEqual(v, z % r, `(${x} * ${y}) %% ${r} = ${z}`);
// 2 BLOCKS
a = calloc(1);
b = calloc(1);
c = calloc(2);
a[0] = x;
b[0] = y;
mul53(a, 0, 1, b, 0, 1, c, 0, 2);
v = c[hb] * r + c[lb];
t.deepEqual(v, z, `${x} * ${y} = ${z}`);
}
});
};
var n = 10;
var R = function(range){ return 2 + randint(0, range - 2)};
var Rlen = 5;
var MUL53 = [integer.lmul53_t, integer.bmul53_t];
var HB = [1, 0];
var LB = [0, 1];
var NAME = ["integer.lmul53_t", "integer.bmul53_t"];
var ALLOC = [
function(n){ return new Uint16Array(n); }
];
var RANGE = [
Math.pow(2, Uint16Array.BYTES_PER_ELEMENT * 8)
];
var i, j, k;
for (i = 0; i < MUL53.length; ++i)
for (j = 0; j < ALLOC.length; ++j)
for (k = 0; k < Rlen; ++k)
runtest(NAME[i], n, MUL53[i], HB[i], LB[i], R(RANGE[j]), ALLOC[j]);