2022-12-23 10:27:39 +00:00
|
|
|
import { Config } from '../core/Config.js'
|
2022-12-23 12:52:56 +00:00
|
|
|
import type { FnComplexBinary } from '../Complex/type.js'
|
|
|
|
import { FnAdd, FnConj, FnSubtract, FnUnaryMinus, FnMultiply, FnAbsSquare, FnReciprocal, FnDivide, FnConservativeSqrt, FnSqrt } from '../interfaces/arithmetic.js'
|
2022-12-07 01:21:05 +00:00
|
|
|
|
2022-12-23 12:52:56 +00:00
|
|
|
export const add: FnAdd<number> = (a, b) => a + b
|
2022-12-22 05:14:58 +00:00
|
|
|
export const addReal = add
|
2022-12-23 12:52:56 +00:00
|
|
|
export const unaryMinus: FnUnaryMinus<number> = (a) => -a
|
|
|
|
export const conj: FnConj<number> = (a) => a
|
|
|
|
export const subtract: FnSubtract<number> = (a, b) => a - b
|
|
|
|
export const multiply: FnMultiply<number> = (a, b) => a * b
|
|
|
|
export const absquare: FnAbsSquare<number, number> = (a) => a * a
|
|
|
|
export const reciprocal: FnReciprocal<number> = (a) => 1 / a
|
|
|
|
export const divide: FnDivide<number> = (a, b) => a / b
|
2022-12-23 10:27:39 +00:00
|
|
|
export const divideByReal = divide
|
2022-12-22 05:14:58 +00:00
|
|
|
|
2022-12-23 12:52:56 +00:00
|
|
|
export const conservativeSqrt: FnConservativeSqrt<number> = (a) => isNaN(a) ? NaN : Math.sqrt(a)
|
2022-12-22 05:14:58 +00:00
|
|
|
|
2022-12-07 01:21:05 +00:00
|
|
|
export const sqrt =
|
2022-12-23 10:27:39 +00:00
|
|
|
(dep: {
|
|
|
|
config: Config,
|
2022-12-23 12:52:56 +00:00
|
|
|
complex: FnComplexBinary<number>
|
|
|
|
}): FnSqrt<number> => {
|
2022-12-23 10:27:39 +00:00
|
|
|
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)))
|
|
|
|
}
|
|
|
|
}
|