2024-09-29 20:48:06 +00:00
|
|
|
import {implementations} from '@/core/Dispatcher'
|
|
|
|
import type {CommonSignature} from '@/interfaces/type'
|
|
|
|
|
|
|
|
const conservativeSqrt = (a: number) => isNaN(a) ? NaN : Math.sqrt(a)
|
|
|
|
|
2024-09-30 05:10:09 +00:00
|
|
|
export const common = implementations<CommonSignature<number>>()
|
2024-09-29 20:48:06 +00:00
|
|
|
.independent({
|
|
|
|
add: (a, b) => a + b,
|
|
|
|
unaryMinus: a => -a,
|
|
|
|
subtract: (a, b) => a - b,
|
|
|
|
multiply: (a, b) => a * b,
|
|
|
|
absquare: a => a * a,
|
|
|
|
reciprocal: a => 1 / a,
|
|
|
|
divide: (a, b) => a / b,
|
|
|
|
conj: a => a,
|
|
|
|
conservativeSqrt })
|
|
|
|
.dependent({config: {}, complex: {}}, {
|
|
|
|
sqrt: dep => {
|
|
|
|
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(-a))
|
|
|
|
}
|
|
|
|
}})
|
|
|
|
.ship()
|