(a, b, epsilon)
| 20 | * @param {Number} [epsilon] |
| 21 | */ |
| 22 | export 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. |
no test coverage detected
searching dependent graphs…