typocomath/src/numbers/arithmetic.ts

29 lines
1.1 KiB
TypeScript

import { Config } from '../core/Config.js'
import type { Complex } from '../Complex/type.js'
export const add = (a: number, b: number): number => a + b
export const addReal = add
export const unaryMinus = (a: number): number => -a
export const conj = (a: number): number => a
export const subtract = (a: number, b: number): number => a - b
export const multiply = (a: number, b: number): number => a * b
export const absquare = (a: number): number => a * a
export const reciprocal = (a: number): number => 1 / a
export const divide = (a: number, b: number): number => a / b
export const divideByReal = divide
export const conservativeSqrt = (a: number): number => isNaN(a) ? NaN : Math.sqrt(a)
export const sqrt =
(dep: {
config: Config,
complex: (re: number, im: number) => Complex<number>
}): (a: number) => number | Complex<number> => {
if (dep.config.predictable || !dep.complex) return conservativeSqrt
return a => {
if (isNaN(a)) return NaN
if (a >= 0) return Math.sqrt(a)
return dep.complex(0, Math.sqrt(unaryMinus(a)))
}
}