feat: convert sqrt for numbers

This commit is contained in:
Jos de Jong 2023-09-21 15:02:42 +02:00
parent 20078d2c87
commit 0ebaaf35ee
3 changed files with 29 additions and 14 deletions

View File

@ -7,7 +7,7 @@
test: 'echo "Error: no test specified" && exit 1', test: 'echo "Error: no test specified" && exit 1',
build: 'mkdirp build && cpy etc/package.json build --flat && tsc', build: 'mkdirp build && cpy etc/package.json build --flat && tsc',
start: 'node build', start: 'node build',
go: 'pnpm --sequential "/build|start/"', go: 'pnpm --sequential "/clean|build|start/"',
clean: 'del-cli build', clean: 'del-cli build',
}, },
packageManager: 'pnpm', packageManager: 'pnpm',

View File

@ -8,17 +8,30 @@ import {absquare as absquare_complex} from './Complex/arithmetic.js'
const mockRealAdd = (a: number, b: number) => a+b const mockRealAdd = (a: number, b: number) => a+b
const mockComplexAbsquare = (z: Complex<number>) => z.re*z.re + z.im*z.im const mockComplexAbsquare = (z: Complex<number>) => z.re*z.re + z.im*z.im
const mockComplex = (re: number, im: number) => ({ re, im })
const config = {
predictable: false,
epsilon: 1e-14
}
const quatAbsquare = absquare_complex({ const quatAbsquare = absquare_complex({
add: mockRealAdd, add: mockRealAdd,
absquare: mockComplexAbsquare absquare: mockComplexAbsquare
}) })
const myabs = quatAbsquare({re: {re: 0, im: 1}, im: {re:2, im: 3}}) const myabs = quatAbsquare({re: {re: 0, im: 1}, im: {re:2, im: 3}})
const typeTest: typeof myabs = 7 // check myabs is just a number const typeTest: typeof myabs = 7 // check myabs is just a number
console.log('Result is myabs=', myabs)
console.log('Result is', myabs) const sqrt = Specifications.numbers.sqrt({
config,
complex: mockComplex
})
console.log('Result of sqrt(16)=', sqrt(16))
console.log('Result of sqrt(-4)=', sqrt(-4))
// Check type of the generic square implementation // Check type of the generic square implementation
console.log('Type of sqrt (number) is', Specifications.numbers.sqrt.reflectedType)
console.log('Type of square is', Specifications.generic.square.reflectedType) console.log('Type of square is', Specifications.generic.square.reflectedType)
console.log('Type of complex square root is', Specifications.complex.sqrt.reflectedType) console.log('Type of complex square root is', Specifications.complex.sqrt.reflectedType)

View File

@ -1,5 +1,6 @@
import type {configDependency} from '../core/Config.js' import type {configDependency} from '../core/Config.js'
import type {Dependencies, Signature} from '../interfaces/type.js' import type {Dependencies, Signature} from '../interfaces/type.js'
import { $implement } from '../interfaces/type.js'
export const add: Signature<'add', number> = (a, b) => a + b export const add: Signature<'add', number> = (a, b) => a + b
export const unaryMinus: Signature<'unaryMinus', number> = a => -a export const unaryMinus: Signature<'unaryMinus', number> = a => -a
@ -13,13 +14,14 @@ export const divide: Signature<'divide', number> = (a, b) => a / b
const basicSqrt = a => isNaN(a) ? NaN : Math.sqrt(a) const basicSqrt = a => isNaN(a) ? NaN : Math.sqrt(a)
export const conservativeSqrt: Signature<'conservativeSqrt', number> = basicSqrt export const conservativeSqrt: Signature<'conservativeSqrt', number> = basicSqrt
export const sqrt = $implement!('sqrt',
(dep: configDependency & Dependencies<'complex', number>): (dep: configDependency & Dependencies<'complex', number>): Signature<'sqrt', number> => {
Signature<'sqrt', number> => { if (dep.config.predictable || !dep.complex) {
if (dep.config.predictable || !dep.complex) return basicSqrt return basicSqrt
return a => { }
if (isNaN(a)) return NaN return a => {
if (a >= 0) return Math.sqrt(a) if (isNaN(a)) return NaN
return dep.complex(0, Math.sqrt(unaryMinus(a))) if (a >= 0) return Math.sqrt(a)
} return dep.complex(0, Math.sqrt(unaryMinus(a)))
} }
})