typocomath/src/numbers/arithmetic.ts

32 lines
1.3 KiB
TypeScript

import type {configDependency} from '../core/Config.js'
import type {ComplexOp} from '../Complex/type.js'
import type {
AddOp, ConjOp, SubtractOp, UnaryMinusOp, MultiplyOp,
AbsquareOp, ReciprocalOp, DivideOp, ConservativeSqrtOp, SqrtOp
} from '../interfaces/arithmetic.js'
import type {Depends} from '../interfaces/type.js'
export const add: AddOp<number> = (a, b) => a + b
export const addReal = add
export const unaryMinus: UnaryMinusOp<number> = a => -a
export const conj: ConjOp<number> = a => a
export const subtract: SubtractOp<number> = (a, b) => a - b
export const multiply: MultiplyOp<number> = (a, b) => a * b
export const absquare: AbsquareOp<number> = a => a * a
export const reciprocal: ReciprocalOp<number> = a => 1 / a
export const divide: DivideOp<number> = (a, b) => a / b
export const divideByReal = divide
const basicSqrt = a => isNaN(a) ? NaN : Math.sqrt(a)
export const conservativeSqrt: ConservativeSqrtOp<number> = basicSqrt
export const sqrt =
(dep: configDependency & Depends<ComplexOp<number>>): SqrtOp<number> => {
if (dep.config.predictable || !dep.complex) return basicSqrt
return a => {
if (isNaN(a)) return NaN
if (a >= 0) return Math.sqrt(a)
return dep.complex(0, Math.sqrt(unaryMinus(a)))
}
}