MCPcopy
hub / github.com/josdejong/mathjs / approxEqual

Function approxEqual

tools/approx.js:22–75  ·  view source on GitHub ↗
(a, b, epsilon)

Source from the content-addressed store, hash-verified

20 * @param {Number} [epsilon]
21 */
22export function approxEqual (a, b, epsilon) {
23 if (epsilon === undefined) {
24 epsilon = EPSILON
25 }
26
27 if (isNumber(a) && isNumber(b)) {
28 if (a === b) {
29 // great, we're done :)
30 } else if (isNaN(a)) {
31 assert.strictEqual(a.toString(), b.toString())
32 } else if (a === 0) {
33 assert.ok(Math.abs(b) < epsilon, (a + ' ~= ' + b))
34 } else if (b === 0) {
35 assert.ok(Math.abs(a) < epsilon, (a + ' ~= ' + b))
36 } else {
37 const diff = Math.abs(a - b)
38 const max = Math.max(Math.abs(a), Math.abs(b))
39 const maxDiff = Math.abs(max * epsilon)
40 assert.ok(diff <= maxDiff, (a + ' ~= ' + b + ' (epsilon: ' + epsilon + ')'))
41 }
42 } else if (a && b && a.isBigNumber && b.isBigNumber) {
43 if (!a.equals(b)) {
44 if (a.isNaN()) assert.ok(b.isNaN())
45 else if (a.equals(0)) {
46 assert.ok(b.abs().lt(epsilon))
47 } else if (b.equals(0)) {
48 assert.ok(a.abs().lt(epsilon))
49 } else {
50 const diff = a.minus(b).abs()
51 let mx = a.abs()
52 if (mx.lt(b.abs())) mx = b.abs()
53 const maxDiff = mx.mul(epsilon)
54 assert.ok(diff.lt(maxDiff), `Diff ${diff} exceeds ${maxDiff}`)
55 }
56 }
57 } else if (a && a.isBigNumber) {
58 return approxEqual(a.toNumber(), b, epsilon)
59 } else if (b && b.isBigNumber) {
60 return approxEqual(a, b.toNumber(), epsilon)
61 } else if ((a && a.isComplex) || (b && b.isComplex)) {
62 if (a && a.isComplex && b && b.isComplex) {
63 approxEqual(a.re, b.re, epsilon)
64 approxEqual(a.im, b.im, epsilon)
65 } else if (a && a.isComplex) {
66 approxEqual(a.re, b, epsilon)
67 approxEqual(a.im, 0, epsilon)
68 } else if (b && b.isComplex) {
69 approxEqual(a, b.re, epsilon)
70 approxEqual(0, b.im, epsilon)
71 }
72 } else {
73 assert.strictEqual(a, b)
74 }
75}
76
77/**
78 * Test whether all values in two objects or arrays are approximately equal.

Callers 1

approxDeepEqualFunction · 0.70

Calls 7

toNumberMethod · 0.80
isNumberFunction · 0.70
toStringMethod · 0.65
absMethod · 0.65
maxMethod · 0.65
equalsMethod · 0.65
isNaNMethod · 0.65

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…