typocomath/src/numbers/relational.ts

30 lines
870 B
TypeScript

import {configDependency} from '../core/Config.js'
import {ImpType, Dependency} from '../core/Dispatcher.js'
const DBL_EPSILON = Number.EPSILON || 2.2204460492503130808472633361816E-16
type NumberRelation = (a: number, b: number) => boolean
declare module "./type" {
interface NumbersImpTypes {
equal: NumberRelation
}
}
export const equal =
(dep: configDependency): ImpType<'equal', [number, number]> =>
(x, y) => {
const eps = dep.config.epsilon
if (eps === null || eps === undefined) return x === y
if (x === y) return true
if (isNaN(x) || isNaN(y)) return false
if (isFinite(x) && isFinite(y)) {
const diff = Math.abs(x - y)
if (diff < DBL_EPSILON) return true
return diff <= Math.max(Math.abs(x), Math.abs(y)) * eps
}
return false
}