typocomath/src/numbers/arithmetic.ts

31 lines
1.3 KiB
TypeScript
Raw Normal View History

import type {configDependency} from '../core/Config.js'
import type {Dependencies, Signature} from '../interfaces/type.js'
import { $reflecType, $reflecTypes } from '../interfaces/type.js'
export const add /*: Signature<'add', number>*/ = (a, b) => a + b
export const unaryMinus: Signature<'unaryMinus', number> = a => -a
export const conj /*: Signature<'conj', number>*/ = a => a
export const subtract /*: Signature<'subtract', number>*/ = (a, b) => a - b
export const multiply: Signature<'multiply', number> = (a, b) => a * b
export const absquare: Signature<'absquare', number> = a => a * a
export const reciprocal: Signature<'reciprocal', number> = a => 1 / a
export const divide: Signature<'divide', number> = (a, b) => a / b
const basicSqrt = (a: number) => isNaN(a) ? NaN : Math.sqrt(a)
export const conservativeSqrt: Signature<'conservativeSqrt', number> = basicSqrt
export const sqrt =
(dep: configDependency
& Dependencies<'complex', number>): Signature<'sqrt', number> => {
2023-09-21 13:02:42 +00:00
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)))
}
}
$reflecType!(sqrt)
$reflecTypes!([add, conj, subtract])