jampary
Version:
Modern arbitrary-precision arithmetic library using floating-point expansions.
116 lines (94 loc) • 3.59 kB
JavaScript
import { test } from '../node_modules/zora/dist/bundle/index.mjs';
import { add, sub, mul, div } from '../dist/jamapry.esm.js';
let abs = Math.abs;
let expected, actual, diff, eps = 1e-61;
let pi = [ 3.141592653589793116e+00, 1.224646799147353207e-16, -2.994769809718339666e-33, 1.112454220863365282e-49 ];
let e = [ 2.718281828459045091e+00, 1.445646891729250158e-16, -2.127717108038176765e-33, 1.515630159841218954e-49 ];
let pi2 = [ 6.283185307179586232e+00, 2.449293598294706414e-16, -5.989539619436679332e-33, 2.224908441726730563e-49 ];
let x = 10000 * (Math.random() - 0.5);
test('4-1 operations', t => {
expected = [0., 0., 0., 0.];
actual = sub(pi, pi);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'diff (diff=' + diff + ')');
expected = pi;
actual = add(add(pi, [x]), [-x]);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'add41 (diff=' + diff + ')');
expected = pi;
actual = sub(sub(pi, [x]), [-x]);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'sub41 (diff=' + diff + ')');
expected = pi2;
actual = mul(pi, [2]);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'mul41 (diff=' + diff + ')');
expected = pi;
actual = div(pi2, [2]);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'div41 (diff=' + diff + ')');
expected = pi;
actual = add(sub(pi, [x]), [x]);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'additive inverse (diff=' + diff + ')');
expected = e;
actual = mul(div(e, [x]), [x]);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'muliplicative inverse (diff=' + diff + ')');
});
test('1-4 operations', t => {
let x = 10000 * (Math.random() - 0.5);
expected = pi;
actual = add([-x], add([x], pi));
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'add14 (diff=' + diff + ')');
expected = pi;
actual = sub([x], sub([x], pi));
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'sub14 (diff=' + diff + ')');
expected = pi2;
actual = mul([2], pi);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'mul14 (diff=' + diff + ')');
expected = div([1], pi);
actual = div([2], pi2);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'div14 (diff=' + diff + ')');
expected = mul(pi, [-1]);
actual = sub([x], add([x], pi));
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'additive inverse (diff=' + diff + ')');
expected = e;
actual = mul([x], div(e, [x]));
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'muliplicative inverse (diff=' + diff + ')');
});
test('4-4 operations', t => {
expected = pi2;
actual = add(pi, pi);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'add (diff=' + diff + ')');
expected = pi;
actual = sub(pi2, pi);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'sub (diff=' + diff + ')');
expected = e;
actual = div(pi, div(pi, e));
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'div (diff=' + diff + ')');
expected = pi;
actual = sub(add(pi, e), e);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'additive inverse (diff=' + diff + ')');
expected = e;
actual = mul(div(e, pi), pi);
diff = abs(sub(expected, actual)[0]);
t.ok(diff < eps, 'multiplicative inverse (diff=' + diff + ')');
});
// import { rsqrt } from '../dist/jamapry.esm.js';
// test('reciprocal sqrt', t => {
// expected = e;
// actual = div([1], mul(rsqrt(e), rsqrt(e)));
// diff = abs(sub(expected, actual)[0]);
// t.ok(diff < eps, 'multiplicative inverse (diff=' + diff + ')');
// });