goscript 0.0.34 → 0.0.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiler/analysis.go +28 -20
- package/compiler/analysis_test.go +14 -0
- package/compiler/assignment.go +19 -7
- package/compiler/compiler.go +15 -99
- package/compiler/composite-lit.go +60 -17
- package/compiler/decl.go +1 -1
- package/compiler/expr-call.go +233 -35
- package/compiler/expr-selector.go +28 -2
- package/compiler/expr.go +13 -37
- package/compiler/lit.go +111 -2
- package/compiler/primitive.go +6 -6
- package/compiler/protobuf.go +0 -5
- package/compiler/sanitize.go +101 -0
- package/compiler/spec-struct.go +41 -8
- package/compiler/spec-value.go +29 -18
- package/compiler/stmt-assign.go +22 -1
- package/compiler/stmt.go +26 -9
- package/compiler/type.go +3 -3
- package/dist/gs/builtin/builtin.d.ts +3 -2
- package/dist/gs/builtin/builtin.js +2 -1
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +7 -1
- package/dist/gs/builtin/slice.js +112 -22
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/errors.d.ts +13 -0
- package/dist/gs/github.com/pkg/errors/errors.js +232 -0
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/go113.d.ts +4 -0
- package/dist/gs/github.com/pkg/errors/go113.js +34 -0
- package/dist/gs/github.com/pkg/errors/go113.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/index.d.ts +3 -0
- package/dist/gs/github.com/pkg/errors/index.js +4 -0
- package/dist/gs/github.com/pkg/errors/index.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/stack.d.ts +32 -0
- package/dist/gs/github.com/pkg/errors/stack.js +111 -0
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -0
- package/dist/gs/maps/index.d.ts +2 -2
- package/dist/gs/maps/index.js +2 -2
- package/dist/gs/maps/index.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +7 -0
- package/dist/gs/maps/iter.js +57 -0
- package/dist/gs/maps/iter.js.map +1 -0
- package/dist/gs/maps/maps.d.ts +7 -0
- package/dist/gs/maps/maps.js +67 -0
- package/dist/gs/maps/maps.js.map +1 -0
- package/dist/gs/math/abs.gs.d.ts +1 -0
- package/dist/gs/math/abs.gs.js +10 -0
- package/dist/gs/math/abs.gs.js.map +1 -0
- package/dist/gs/math/acosh.gs.d.ts +2 -0
- package/dist/gs/math/acosh.gs.js +14 -0
- package/dist/gs/math/acosh.gs.js.map +1 -0
- package/dist/gs/math/asin.gs.d.ts +4 -0
- package/dist/gs/math/asin.gs.js +24 -0
- package/dist/gs/math/asin.gs.js.map +1 -0
- package/dist/gs/math/asinh.gs.d.ts +2 -0
- package/dist/gs/math/asinh.gs.js +14 -0
- package/dist/gs/math/asinh.gs.js.map +1 -0
- package/dist/gs/math/atan.gs.d.ts +4 -0
- package/dist/gs/math/atan.gs.js +22 -0
- package/dist/gs/math/atan.gs.js.map +1 -0
- package/dist/gs/math/atan2.gs.d.ts +2 -0
- package/dist/gs/math/atan2.gs.js +30 -0
- package/dist/gs/math/atan2.gs.js.map +1 -0
- package/dist/gs/math/atanh.gs.d.ts +2 -0
- package/dist/gs/math/atanh.gs.js +16 -0
- package/dist/gs/math/atanh.gs.js.map +1 -0
- package/dist/gs/math/bits.gs.d.ts +5 -0
- package/dist/gs/math/bits.gs.js +46 -0
- package/dist/gs/math/bits.gs.js.map +1 -0
- package/dist/gs/math/cbrt.gs.d.ts +2 -0
- package/dist/gs/math/cbrt.gs.js +14 -0
- package/dist/gs/math/cbrt.gs.js.map +1 -0
- package/dist/gs/math/const.gs.d.ts +30 -0
- package/dist/gs/math/const.gs.js +61 -0
- package/dist/gs/math/const.gs.js.map +1 -0
- package/dist/gs/math/copysign.gs.d.ts +1 -0
- package/dist/gs/math/copysign.gs.js +20 -0
- package/dist/gs/math/copysign.gs.js.map +1 -0
- package/dist/gs/math/dim.gs.d.ts +5 -0
- package/dist/gs/math/dim.gs.js +69 -0
- package/dist/gs/math/dim.gs.js.map +1 -0
- package/dist/gs/math/erf.gs.d.ts +4 -0
- package/dist/gs/math/erf.gs.js +336 -0
- package/dist/gs/math/erf.gs.js.map +1 -0
- package/dist/gs/math/erfinv.gs.d.ts +2 -0
- package/dist/gs/math/erfinv.gs.js +118 -0
- package/dist/gs/math/erfinv.gs.js.map +1 -0
- package/dist/gs/math/exp.gs.d.ts +5 -0
- package/dist/gs/math/exp.gs.js +30 -0
- package/dist/gs/math/exp.gs.js.map +1 -0
- package/dist/gs/math/expm1.gs.d.ts +2 -0
- package/dist/gs/math/expm1.gs.js +17 -0
- package/dist/gs/math/expm1.gs.js.map +1 -0
- package/dist/gs/math/floor.gs.d.ts +8 -0
- package/dist/gs/math/floor.gs.js +75 -0
- package/dist/gs/math/floor.gs.js.map +1 -0
- package/dist/gs/math/fma.gs.d.ts +1 -0
- package/dist/gs/math/fma.gs.js +8 -0
- package/dist/gs/math/fma.gs.js.map +1 -0
- package/dist/gs/math/frexp.gs.d.ts +2 -0
- package/dist/gs/math/frexp.gs.js +28 -0
- package/dist/gs/math/frexp.gs.js.map +1 -0
- package/dist/gs/math/gamma.gs.d.ts +3 -0
- package/dist/gs/math/gamma.gs.js +149 -0
- package/dist/gs/math/gamma.gs.js.map +1 -0
- package/dist/gs/math/hypot.gs.d.ts +2 -0
- package/dist/gs/math/hypot.gs.js +16 -0
- package/dist/gs/math/hypot.gs.js.map +1 -0
- package/dist/gs/math/index.d.ts +44 -0
- package/dist/gs/math/index.js +45 -0
- package/dist/gs/math/index.js.map +1 -0
- package/dist/gs/math/j0.gs.d.ts +4 -0
- package/dist/gs/math/j0.gs.js +228 -0
- package/dist/gs/math/j0.gs.js.map +1 -0
- package/dist/gs/math/j1.gs.d.ts +4 -0
- package/dist/gs/math/j1.gs.js +211 -0
- package/dist/gs/math/j1.gs.js.map +1 -0
- package/dist/gs/math/jn.gs.d.ts +2 -0
- package/dist/gs/math/jn.gs.js +412 -0
- package/dist/gs/math/jn.gs.js.map +1 -0
- package/dist/gs/math/ldexp.gs.d.ts +2 -0
- package/dist/gs/math/ldexp.gs.js +20 -0
- package/dist/gs/math/ldexp.gs.js.map +1 -0
- package/dist/gs/math/lgamma.gs.d.ts +2 -0
- package/dist/gs/math/lgamma.gs.js +243 -0
- package/dist/gs/math/lgamma.gs.js.map +1 -0
- package/dist/gs/math/log.gs.d.ts +2 -0
- package/dist/gs/math/log.gs.js +16 -0
- package/dist/gs/math/log.gs.js.map +1 -0
- package/dist/gs/math/log10.gs.d.ts +4 -0
- package/dist/gs/math/log10.gs.js +17 -0
- package/dist/gs/math/log10.gs.js.map +1 -0
- package/dist/gs/math/log1p.gs.d.ts +2 -0
- package/dist/gs/math/log1p.gs.js +17 -0
- package/dist/gs/math/log1p.gs.js.map +1 -0
- package/dist/gs/math/logb.gs.d.ts +3 -0
- package/dist/gs/math/logb.gs.js +43 -0
- package/dist/gs/math/logb.gs.js.map +1 -0
- package/dist/gs/math/mod.gs.d.ts +2 -0
- package/dist/gs/math/mod.gs.js +26 -0
- package/dist/gs/math/mod.gs.js.map +1 -0
- package/dist/gs/math/modf.gs.d.ts +2 -0
- package/dist/gs/math/modf.gs.js +24 -0
- package/dist/gs/math/modf.gs.js.map +1 -0
- package/dist/gs/math/nextafter.gs.d.ts +2 -0
- package/dist/gs/math/nextafter.gs.js +66 -0
- package/dist/gs/math/nextafter.gs.js.map +1 -0
- package/dist/gs/math/pow.gs.d.ts +3 -0
- package/dist/gs/math/pow.gs.js +40 -0
- package/dist/gs/math/pow.gs.js.map +1 -0
- package/dist/gs/math/pow10.gs.d.ts +1 -0
- package/dist/gs/math/pow10.gs.js +14 -0
- package/dist/gs/math/pow10.gs.js.map +1 -0
- package/dist/gs/math/remainder.gs.d.ts +2 -0
- package/dist/gs/math/remainder.gs.js +25 -0
- package/dist/gs/math/remainder.gs.js.map +1 -0
- package/dist/gs/math/signbit.gs.d.ts +1 -0
- package/dist/gs/math/signbit.gs.js +5 -0
- package/dist/gs/math/signbit.gs.js.map +1 -0
- package/dist/gs/math/sin.gs.d.ts +4 -0
- package/dist/gs/math/sin.gs.js +29 -0
- package/dist/gs/math/sin.gs.js.map +1 -0
- package/dist/gs/math/sincos.gs.d.ts +1 -0
- package/dist/gs/math/sincos.gs.js +11 -0
- package/dist/gs/math/sincos.gs.js.map +1 -0
- package/dist/gs/math/sinh.gs.d.ts +4 -0
- package/dist/gs/math/sinh.gs.js +27 -0
- package/dist/gs/math/sinh.gs.js.map +1 -0
- package/dist/gs/math/sqrt.gs.d.ts +2 -0
- package/dist/gs/math/sqrt.gs.js +15 -0
- package/dist/gs/math/sqrt.gs.js.map +1 -0
- package/dist/gs/math/tan.gs.d.ts +2 -0
- package/dist/gs/math/tan.gs.js +17 -0
- package/dist/gs/math/tan.gs.js.map +1 -0
- package/dist/gs/math/tanh.gs.d.ts +2 -0
- package/dist/gs/math/tanh.gs.js +17 -0
- package/dist/gs/math/tanh.gs.js.map +1 -0
- package/dist/gs/math/trig_reduce.gs.d.ts +1 -0
- package/dist/gs/math/trig_reduce.gs.js +62 -0
- package/dist/gs/math/trig_reduce.gs.js.map +1 -0
- package/dist/gs/math/unsafe.gs.d.ts +4 -0
- package/dist/gs/math/unsafe.gs.js +47 -0
- package/dist/gs/math/unsafe.gs.js.map +1 -0
- package/dist/gs/strconv/atob.gs.d.ts +4 -0
- package/dist/gs/strconv/atob.gs.js +42 -0
- package/dist/gs/strconv/atob.gs.js.map +1 -0
- package/dist/gs/strconv/atof.gs.d.ts +2 -0
- package/dist/gs/strconv/atof.gs.js +51 -0
- package/dist/gs/strconv/atof.gs.js.map +1 -0
- package/dist/gs/strconv/atoi.gs.d.ts +33 -0
- package/dist/gs/strconv/atoi.gs.js +200 -0
- package/dist/gs/strconv/atoi.gs.js.map +1 -0
- package/dist/gs/strconv/doc.gs.d.ts +1 -0
- package/dist/gs/strconv/doc.gs.js +2 -0
- package/dist/gs/strconv/doc.gs.js.map +1 -0
- package/dist/gs/strconv/ftoa.gs.d.ts +3 -0
- package/dist/gs/strconv/ftoa.gs.js +58 -0
- package/dist/gs/strconv/ftoa.gs.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +6 -0
- package/dist/gs/strconv/index.js +7 -0
- package/dist/gs/strconv/index.js.map +1 -0
- package/dist/gs/strconv/itoa.gs.d.ts +6 -0
- package/dist/gs/strconv/itoa.gs.js +37 -0
- package/dist/gs/strconv/itoa.gs.js.map +1 -0
- package/dist/gs/strconv/quote.gs.d.ts +19 -0
- package/dist/gs/strconv/quote.gs.js +217 -0
- package/dist/gs/strconv/quote.gs.js.map +1 -0
- package/dist/gs/strings/index.d.ts +3 -0
- package/dist/gs/strings/index.js +4 -0
- package/dist/gs/strings/index.js.map +1 -1
- package/dist/gs/strings/replace.d.ts +0 -74
- package/dist/gs/strings/replace.js +6 -204
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/search.d.ts +0 -1
- package/dist/gs/strings/search.js +0 -21
- package/dist/gs/strings/search.js.map +1 -1
- package/dist/gs/sync/atomic/doc.gs.d.ts +28 -0
- package/dist/gs/sync/atomic/doc.gs.js +265 -0
- package/dist/gs/sync/atomic/doc.gs.js.map +1 -0
- package/dist/gs/sync/atomic/doc_64.gs.d.ts +15 -0
- package/dist/gs/sync/atomic/doc_64.gs.js +165 -0
- package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -0
- package/dist/gs/sync/atomic/index.d.ts +4 -0
- package/dist/gs/sync/atomic/index.js +5 -0
- package/dist/gs/sync/atomic/index.js.map +1 -0
- package/dist/gs/sync/atomic/type.gs.d.ts +130 -0
- package/dist/gs/sync/atomic/type.gs.js +433 -0
- package/dist/gs/sync/atomic/type.gs.js.map +1 -0
- package/dist/gs/sync/atomic/value.gs.d.ts +19 -0
- package/dist/gs/sync/atomic/value.gs.js +116 -0
- package/dist/gs/sync/atomic/value.gs.js.map +1 -0
- package/dist/gs/unsafe/unsafe.d.ts +1 -0
- package/dist/gs/unsafe/unsafe.js +5 -0
- package/dist/gs/unsafe/unsafe.js.map +1 -1
- package/gs/builtin/builtin.ts +9 -7
- package/gs/builtin/map.ts +5 -1
- package/gs/builtin/slice.ts +152 -24
- package/gs/github.com/pkg/errors/errors.ts +307 -0
- package/gs/github.com/pkg/errors/go113.ts +39 -0
- package/gs/github.com/pkg/errors/index.ts +3 -0
- package/gs/github.com/pkg/errors/stack.ts +127 -0
- package/gs/maps/index.ts +2 -2
- package/gs/maps/iter.ts +67 -0
- package/gs/maps/maps.ts +89 -0
- package/gs/math/TODO.md +156 -0
- package/gs/math/abs.gs.test.ts +29 -0
- package/gs/math/abs.gs.ts +13 -0
- package/gs/math/acosh.gs.test.ts +39 -0
- package/gs/math/acosh.gs.ts +21 -0
- package/gs/math/asin.gs.test.ts +66 -0
- package/gs/math/asin.gs.ts +27 -0
- package/gs/math/asinh.gs.test.ts +37 -0
- package/gs/math/asinh.gs.ts +21 -0
- package/gs/math/atan.gs.test.ts +49 -0
- package/gs/math/atan.gs.ts +27 -0
- package/gs/math/atan2.gs.test.ts +55 -0
- package/gs/math/atan2.gs.ts +37 -0
- package/gs/math/atanh.gs.test.ts +47 -0
- package/gs/math/atanh.gs.ts +21 -0
- package/gs/math/bits.gs.test.ts +88 -0
- package/gs/math/bits.gs.ts +61 -0
- package/gs/math/cbrt.gs.test.ts +57 -0
- package/gs/math/cbrt.gs.ts +20 -0
- package/gs/math/const.gs.test.ts +54 -0
- package/gs/math/const.gs.ts +93 -0
- package/gs/math/copysign.gs.test.ts +44 -0
- package/gs/math/copysign.gs.ts +27 -0
- package/gs/math/dim.gs.test.ts +102 -0
- package/gs/math/dim.gs.ts +84 -0
- package/gs/math/erf.gs.test.ts +92 -0
- package/gs/math/erf.gs.ts +409 -0
- package/gs/math/erfinv.gs.test.ts +104 -0
- package/gs/math/erfinv.gs.ts +169 -0
- package/gs/math/exp.gs.test.ts +82 -0
- package/gs/math/exp.gs.ts +39 -0
- package/gs/math/expm1.gs.test.ts +48 -0
- package/gs/math/expm1.gs.ts +23 -0
- package/gs/math/floor.gs.test.ts +146 -0
- package/gs/math/floor.gs.ts +88 -0
- package/gs/math/fma.gs.test.ts +83 -0
- package/gs/math/fma.gs.ts +7 -0
- package/gs/math/frexp.gs.test.ts +146 -0
- package/gs/math/frexp.gs.ts +37 -0
- package/gs/math/gamma.gs.test.ts +66 -0
- package/gs/math/gamma.gs.ts +158 -0
- package/gs/math/hypot.gs.test.ts +73 -0
- package/gs/math/hypot.gs.ts +23 -0
- package/gs/math/index.ts +44 -0
- package/gs/math/j0.gs.test.ts +74 -0
- package/gs/math/j0.gs.ts +257 -0
- package/gs/math/j1.gs.test.ts +81 -0
- package/gs/math/j1.gs.ts +231 -0
- package/gs/math/jn.gs.test.ts +133 -0
- package/gs/math/jn.gs.ts +447 -0
- package/gs/math/ldexp.gs.test.ts +128 -0
- package/gs/math/ldexp.gs.ts +28 -0
- package/gs/math/lgamma.gs.test.ts +102 -0
- package/gs/math/lgamma.gs.ts +251 -0
- package/gs/math/log.gs.test.ts +40 -0
- package/gs/math/log.gs.ts +21 -0
- package/gs/math/log10.gs.test.ts +80 -0
- package/gs/math/log10.gs.ts +25 -0
- package/gs/math/log1p.gs.test.ts +55 -0
- package/gs/math/log1p.gs.ts +24 -0
- package/gs/math/logb.gs.test.ts +87 -0
- package/gs/math/logb.gs.ts +54 -0
- package/gs/math/mod.gs.test.ts +64 -0
- package/gs/math/mod.gs.ts +36 -0
- package/gs/math/modf.gs.test.ts +80 -0
- package/gs/math/modf.gs.ts +32 -0
- package/gs/math/nextafter.gs.test.ts +107 -0
- package/gs/math/nextafter.gs.ts +71 -0
- package/gs/math/pow.gs.test.ts +103 -0
- package/gs/math/pow.gs.ts +55 -0
- package/gs/math/pow10.gs.test.ts +58 -0
- package/gs/math/pow10.gs.ts +19 -0
- package/gs/math/remainder.gs.test.ts +70 -0
- package/gs/math/remainder.gs.ts +33 -0
- package/gs/math/signbit.gs.test.ts +33 -0
- package/gs/math/signbit.gs.ts +8 -0
- package/gs/math/sin.gs.test.ts +83 -0
- package/gs/math/sin.gs.ts +38 -0
- package/gs/math/sincos.gs.test.ts +91 -0
- package/gs/math/sincos.gs.ts +15 -0
- package/gs/math/sinh.gs.test.ts +66 -0
- package/gs/math/sinh.gs.ts +34 -0
- package/gs/math/sqrt.gs.test.ts +49 -0
- package/gs/math/sqrt.gs.ts +20 -0
- package/gs/math/tan.gs.test.ts +50 -0
- package/gs/math/tan.gs.ts +23 -0
- package/gs/math/tanh.gs.test.ts +52 -0
- package/gs/math/tanh.gs.ts +23 -0
- package/gs/math/trig_reduce.gs.ts +66 -0
- package/gs/math/unsafe.gs.ts +52 -0
- package/gs/strconv/atob.gs.ts +45 -0
- package/gs/strconv/atof.gs.ts +60 -0
- package/gs/strconv/atoi.gs.ts +243 -0
- package/gs/strconv/doc.gs.ts +2 -0
- package/gs/strconv/ftoa.gs.ts +66 -0
- package/gs/strconv/index.ts +6 -0
- package/gs/strconv/itoa.gs.ts +41 -0
- package/gs/strconv/quote.gs.ts +245 -0
- package/gs/strings/index.ts +4 -0
- package/gs/strings/replace.ts +9 -237
- package/gs/strings/search.ts +0 -28
- package/gs/sync/atomic/doc.gs.ts +276 -0
- package/gs/sync/atomic/doc_64.gs.ts +168 -0
- package/gs/sync/atomic/index.ts +4 -0
- package/gs/sync/atomic/type.gs.ts +596 -0
- package/gs/sync/atomic/value.gs.ts +158 -0
- package/gs/unsafe/unsafe.ts +6 -0
- package/package.json +1 -1
- package/gs/maps/iter.gs.ts +0 -71
- package/gs/maps/maps.gs.ts +0 -87
- package/gs/stringslite/godoc.txt +0 -17
- package/gs/stringslite/index.ts +0 -1
- package/gs/stringslite/strings.ts +0 -82
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
import { Float64bits, Float64frombits } from "./unsafe.gs.js";
|
|
3
|
+
|
|
4
|
+
// Copysign returns a value with the magnitude of f
|
|
5
|
+
// and the sign of sign.
|
|
6
|
+
export function Copysign(f: number, sign: number): number {
|
|
7
|
+
// Handle special cases for zero
|
|
8
|
+
if (f === 0) {
|
|
9
|
+
return sign < 0 || Object.is(sign, -0) ? -0 : 0
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const magnitude = Math.abs(f)
|
|
13
|
+
const signValue = Math.sign(sign)
|
|
14
|
+
|
|
15
|
+
// Handle NaN case
|
|
16
|
+
if (Number.isNaN(sign)) {
|
|
17
|
+
return signValue < 0 ? -magnitude : magnitude
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Handle negative zero case
|
|
21
|
+
if (Object.is(sign, -0)) {
|
|
22
|
+
return -magnitude
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return signValue < 0 ? -magnitude : magnitude
|
|
26
|
+
}
|
|
27
|
+
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { Dim, Max, max, Min, min } from './dim.gs.js'
|
|
3
|
+
|
|
4
|
+
describe('Dim', () => {
|
|
5
|
+
it('should return maximum of x-y or 0', () => {
|
|
6
|
+
expect(Dim(5, 3)).toBe(2)
|
|
7
|
+
expect(Dim(3, 5)).toBe(0)
|
|
8
|
+
expect(Dim(10, 10)).toBe(0)
|
|
9
|
+
expect(Dim(-5, -3)).toBe(0)
|
|
10
|
+
expect(Dim(-3, -5)).toBe(2)
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
it('should handle special cases', () => {
|
|
14
|
+
expect(Number.isNaN(Dim(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY))).toBe(true)
|
|
15
|
+
expect(Number.isNaN(Dim(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY))).toBe(true)
|
|
16
|
+
expect(Number.isNaN(Dim(5, Number.NaN))).toBe(true)
|
|
17
|
+
expect(Number.isNaN(Dim(Number.NaN, 5))).toBe(true)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should handle infinity cases', () => {
|
|
21
|
+
expect(Dim(Number.POSITIVE_INFINITY, 5)).toBe(Number.POSITIVE_INFINITY)
|
|
22
|
+
expect(Dim(5, Number.NEGATIVE_INFINITY)).toBe(Number.POSITIVE_INFINITY)
|
|
23
|
+
expect(Dim(Number.NEGATIVE_INFINITY, 5)).toBe(0)
|
|
24
|
+
expect(Dim(5, Number.POSITIVE_INFINITY)).toBe(0)
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe('Max', () => {
|
|
29
|
+
it('should return the larger value', () => {
|
|
30
|
+
expect(Max(5, 3)).toBe(5)
|
|
31
|
+
expect(Max(3, 5)).toBe(5)
|
|
32
|
+
expect(Max(-5, -3)).toBe(-3)
|
|
33
|
+
expect(Max(-3, -5)).toBe(-3)
|
|
34
|
+
expect(Max(0, 0)).toBe(0)
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
it('should handle special cases', () => {
|
|
38
|
+
expect(Max(5, Number.POSITIVE_INFINITY)).toBe(Number.POSITIVE_INFINITY)
|
|
39
|
+
expect(Max(Number.POSITIVE_INFINITY, 5)).toBe(Number.POSITIVE_INFINITY)
|
|
40
|
+
expect(Number.isNaN(Max(5, Number.NaN))).toBe(true)
|
|
41
|
+
expect(Number.isNaN(Max(Number.NaN, 5))).toBe(true)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should handle zero cases correctly', () => {
|
|
45
|
+
expect(Max(0, -0)).toBe(0)
|
|
46
|
+
expect(Max(-0, 0)).toBe(0)
|
|
47
|
+
expect(Max(-0, -0)).toBe(-0)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('should handle infinity cases', () => {
|
|
51
|
+
expect(Max(Number.NEGATIVE_INFINITY, 5)).toBe(5)
|
|
52
|
+
expect(Max(5, Number.NEGATIVE_INFINITY)).toBe(5)
|
|
53
|
+
expect(Max(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY)).toBe(Number.POSITIVE_INFINITY)
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
describe('max', () => {
|
|
58
|
+
it('should work the same as Max', () => {
|
|
59
|
+
expect(max(5, 3)).toBe(Max(5, 3))
|
|
60
|
+
expect(max(-5, -3)).toBe(Max(-5, -3))
|
|
61
|
+
expect(max(0, -0)).toBe(Max(0, -0))
|
|
62
|
+
expect(Number.isNaN(max(5, Number.NaN))).toBe(Number.isNaN(Max(5, Number.NaN)))
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
describe('Min', () => {
|
|
67
|
+
it('should return the smaller value', () => {
|
|
68
|
+
expect(Min(5, 3)).toBe(3)
|
|
69
|
+
expect(Min(3, 5)).toBe(3)
|
|
70
|
+
expect(Min(-5, -3)).toBe(-5)
|
|
71
|
+
expect(Min(-3, -5)).toBe(-5)
|
|
72
|
+
expect(Min(0, 0)).toBe(0)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('should handle special cases', () => {
|
|
76
|
+
expect(Min(5, Number.NEGATIVE_INFINITY)).toBe(Number.NEGATIVE_INFINITY)
|
|
77
|
+
expect(Min(Number.NEGATIVE_INFINITY, 5)).toBe(Number.NEGATIVE_INFINITY)
|
|
78
|
+
expect(Number.isNaN(Min(5, Number.NaN))).toBe(true)
|
|
79
|
+
expect(Number.isNaN(Min(Number.NaN, 5))).toBe(true)
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
it('should handle zero cases correctly', () => {
|
|
83
|
+
expect(Min(0, -0)).toBe(-0)
|
|
84
|
+
expect(Min(-0, 0)).toBe(-0)
|
|
85
|
+
expect(Min(0, 0)).toBe(0)
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it('should handle infinity cases', () => {
|
|
89
|
+
expect(Min(Number.POSITIVE_INFINITY, 5)).toBe(5)
|
|
90
|
+
expect(Min(5, Number.POSITIVE_INFINITY)).toBe(5)
|
|
91
|
+
expect(Min(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY)).toBe(Number.NEGATIVE_INFINITY)
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
describe('min', () => {
|
|
96
|
+
it('should work the same as Min', () => {
|
|
97
|
+
expect(min(5, 3)).toBe(Min(5, 3))
|
|
98
|
+
expect(min(-5, -3)).toBe(Min(-5, -3))
|
|
99
|
+
expect(min(0, -0)).toBe(Min(0, -0))
|
|
100
|
+
expect(Number.isNaN(min(5, Number.NaN))).toBe(Number.isNaN(Min(5, Number.NaN)))
|
|
101
|
+
})
|
|
102
|
+
})
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
import { Inf, IsInf, IsNaN, NaN } from "./bits.gs.js";
|
|
3
|
+
// archMax and archMin imports removed - using optimized implementation
|
|
4
|
+
import { Signbit } from "./signbit.gs.js";
|
|
5
|
+
|
|
6
|
+
// Dim returns the maximum of x-y or 0.
|
|
7
|
+
//
|
|
8
|
+
// Special cases are:
|
|
9
|
+
//
|
|
10
|
+
// Dim(+Inf, +Inf) = NaN
|
|
11
|
+
// Dim(-Inf, -Inf) = NaN
|
|
12
|
+
// Dim(x, NaN) = Dim(NaN, x) = NaN
|
|
13
|
+
export function Dim(x: number, y: number): number {
|
|
14
|
+
const v = x - y
|
|
15
|
+
return v <= 0 ? 0 : v
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Max returns the larger of x or y.
|
|
19
|
+
//
|
|
20
|
+
// Special cases are:
|
|
21
|
+
//
|
|
22
|
+
// Max(x, +Inf) = Max(+Inf, x) = +Inf
|
|
23
|
+
// Max(x, NaN) = Max(NaN, x) = NaN
|
|
24
|
+
// Max(+0, ±0) = Max(±0, +0) = +0
|
|
25
|
+
// Max(-0, -0) = -0
|
|
26
|
+
//
|
|
27
|
+
// Note that this differs from the built-in function max when called
|
|
28
|
+
// with NaN and +Inf.
|
|
29
|
+
export function Max(x: number, y: number): number {
|
|
30
|
+
return max(x, y)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function max(x: number, y: number): number {
|
|
34
|
+
// Handle NaN cases
|
|
35
|
+
if (Number.isNaN(x) || Number.isNaN(y)) {
|
|
36
|
+
return Number.NaN
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Handle infinity cases
|
|
40
|
+
if (x === Number.POSITIVE_INFINITY || y === Number.POSITIVE_INFINITY) {
|
|
41
|
+
return Number.POSITIVE_INFINITY
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Handle zero cases - prefer +0 over -0
|
|
45
|
+
if (x === 0 && y === 0) {
|
|
46
|
+
return Object.is(x, -0) ? y : x
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return Math.max(x, y)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Min returns the smaller of x or y.
|
|
53
|
+
//
|
|
54
|
+
// Special cases are:
|
|
55
|
+
//
|
|
56
|
+
// Min(x, -Inf) = Min(-Inf, x) = -Inf
|
|
57
|
+
// Min(x, NaN) = Min(NaN, x) = NaN
|
|
58
|
+
// Min(-0, ±0) = Min(±0, -0) = -0
|
|
59
|
+
//
|
|
60
|
+
// Note that this differs from the built-in function min when called
|
|
61
|
+
// with NaN and -Inf.
|
|
62
|
+
export function Min(x: number, y: number): number {
|
|
63
|
+
return min(x, y)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function min(x: number, y: number): number {
|
|
67
|
+
// Handle NaN cases
|
|
68
|
+
if (Number.isNaN(x) || Number.isNaN(y)) {
|
|
69
|
+
return Number.NaN
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Handle infinity cases
|
|
73
|
+
if (x === Number.NEGATIVE_INFINITY || y === Number.NEGATIVE_INFINITY) {
|
|
74
|
+
return Number.NEGATIVE_INFINITY
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Handle zero cases - prefer -0 over +0
|
|
78
|
+
if (x === 0 && y === 0) {
|
|
79
|
+
return Object.is(x, -0) ? x : y
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return Math.min(x, y)
|
|
83
|
+
}
|
|
84
|
+
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { Erf, erf, Erfc, erfc } from './erf.gs.js'
|
|
3
|
+
|
|
4
|
+
describe('Erf', () => {
|
|
5
|
+
it('should return correct values for zero', () => {
|
|
6
|
+
expect(Erf(0)).toBe(0)
|
|
7
|
+
expect(Erf(-0)).toBe(-0)
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('should return correct values for common inputs', () => {
|
|
11
|
+
// Relax precision tolerance for JavaScript floating-point differences
|
|
12
|
+
expect(Erf(0.5)).toBeCloseTo(0.5204998778130465, 6)
|
|
13
|
+
expect(Erf(1)).toBeCloseTo(0.8427007929497149, 6)
|
|
14
|
+
expect(Erf(-0.5)).toBeCloseTo(-0.5204998778130465, 6)
|
|
15
|
+
expect(Erf(-1)).toBeCloseTo(-0.8427007929497149, 6)
|
|
16
|
+
expect(Erf(2)).toBeCloseTo(0.9953222650189527, 8)
|
|
17
|
+
expect(Erf(-2)).toBeCloseTo(-0.9953222650189527, 8)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('should handle special values', () => {
|
|
21
|
+
expect(Erf(Number.POSITIVE_INFINITY)).toBe(1)
|
|
22
|
+
expect(Erf(Number.NEGATIVE_INFINITY)).toBe(-1)
|
|
23
|
+
expect(Number.isNaN(Erf(Number.NaN))).toBe(true)
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
it('should be an odd function', () => {
|
|
27
|
+
const testValues = [0.1, 0.5, 1, 1.5, 2]
|
|
28
|
+
for (const x of testValues) {
|
|
29
|
+
expect(Erf(-x)).toBeCloseTo(-Erf(x), 14)
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('should approach limits correctly', () => {
|
|
34
|
+
expect(Erf(5)).toBeCloseTo(1, 10)
|
|
35
|
+
expect(Erf(-5)).toBeCloseTo(-1, 10)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
describe('erf', () => {
|
|
40
|
+
it('should work the same as Erf', () => {
|
|
41
|
+
expect(erf(0)).toBe(Erf(0))
|
|
42
|
+
expect(erf(0.5)).toBe(Erf(0.5))
|
|
43
|
+
expect(erf(1)).toBe(Erf(1))
|
|
44
|
+
expect(erf(-1)).toBe(Erf(-1))
|
|
45
|
+
expect(Number.isNaN(erf(Number.NaN))).toBe(true)
|
|
46
|
+
})
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
describe('Erfc', () => {
|
|
50
|
+
it('should return correct values for zero', () => {
|
|
51
|
+
expect(Erfc(0)).toBe(1)
|
|
52
|
+
expect(Erfc(-0)).toBe(1)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should return correct values for common inputs', () => {
|
|
56
|
+
// Relax precision tolerance for JavaScript floating-point differences
|
|
57
|
+
expect(Erfc(0.5)).toBeCloseTo(0.4795001221869535, 6)
|
|
58
|
+
expect(Erfc(1)).toBeCloseTo(0.1572992070502851, 6)
|
|
59
|
+
expect(Erfc(-0.5)).toBeCloseTo(1.5204998778130465, 6)
|
|
60
|
+
expect(Erfc(-1)).toBeCloseTo(1.8427007929497148, 6)
|
|
61
|
+
expect(Erfc(2)).toBeCloseTo(0.004677734981047265, 8)
|
|
62
|
+
expect(Erfc(-2)).toBeCloseTo(1.9953222650189528, 8)
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('should handle special values', () => {
|
|
66
|
+
expect(Erfc(Number.POSITIVE_INFINITY)).toBe(0)
|
|
67
|
+
expect(Erfc(Number.NEGATIVE_INFINITY)).toBe(2)
|
|
68
|
+
expect(Number.isNaN(Erfc(Number.NaN))).toBe(true)
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('should satisfy Erfc(x) = 1 - Erf(x)', () => {
|
|
72
|
+
const testValues = [0, 0.5, 1, -0.5, -1, 2, -2]
|
|
73
|
+
for (const x of testValues) {
|
|
74
|
+
expect(Erfc(x)).toBeCloseTo(1 - Erf(x), 14)
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
it('should approach limits correctly', () => {
|
|
79
|
+
expect(Erfc(5)).toBeCloseTo(0, 10)
|
|
80
|
+
expect(Erfc(-5)).toBeCloseTo(2, 10)
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
describe('erfc', () => {
|
|
85
|
+
it('should work the same as Erfc', () => {
|
|
86
|
+
expect(erfc(0)).toBe(Erfc(0))
|
|
87
|
+
expect(erfc(0.5)).toBe(Erfc(0.5))
|
|
88
|
+
expect(erfc(1)).toBe(Erfc(1))
|
|
89
|
+
expect(erfc(-1)).toBe(Erfc(-1))
|
|
90
|
+
expect(Number.isNaN(erfc(Number.NaN))).toBe(true)
|
|
91
|
+
})
|
|
92
|
+
})
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import * as $ from "@goscript/builtin/builtin.js";
|
|
2
|
+
import { IsInf, IsNaN, NaN } from "./bits.gs.js";
|
|
3
|
+
import { Exp } from "./exp.gs.js";
|
|
4
|
+
|
|
5
|
+
import { Float64bits, Float64frombits } from "./unsafe.gs.js";
|
|
6
|
+
|
|
7
|
+
// 0x3FEB0AC160000000
|
|
8
|
+
let erx: number = 8.45062911510467529297e-01
|
|
9
|
+
|
|
10
|
+
// Coefficients for approximation to erf in [0, 0.84375]
|
|
11
|
+
// 0x3FC06EBA8214DB69
|
|
12
|
+
let efx: number = 1.28379167095512586316e-01
|
|
13
|
+
|
|
14
|
+
// 0x3FF06EBA8214DB69
|
|
15
|
+
let efx8: number = 1.02703333676410069053e+00
|
|
16
|
+
|
|
17
|
+
// 0x3FC06EBA8214DB68
|
|
18
|
+
let pp0: number = 1.28379167095512558561e-01
|
|
19
|
+
|
|
20
|
+
// 0xBFD4CD7D691CB913
|
|
21
|
+
let pp1: number = -3.25042107247001499370e-01
|
|
22
|
+
|
|
23
|
+
// 0xBF9D2A51DBD7194F
|
|
24
|
+
let pp2: number = -2.84817495755985104766e-02
|
|
25
|
+
|
|
26
|
+
// 0xBF77A291236668E4
|
|
27
|
+
let pp3: number = -5.77027029648944159157e-03
|
|
28
|
+
|
|
29
|
+
// 0xBEF8EAD6120016AC
|
|
30
|
+
let pp4: number = -2.37630166566501626084e-05
|
|
31
|
+
|
|
32
|
+
// 0x3FD97779CDDADC09
|
|
33
|
+
let qq1: number = 3.97917223959155352819e-01
|
|
34
|
+
|
|
35
|
+
// 0x3FB0A54C5536CEBA
|
|
36
|
+
let qq2: number = 6.50222499887672944485e-02
|
|
37
|
+
|
|
38
|
+
// 0x3F74D022C4D36B0F
|
|
39
|
+
let qq3: number = 5.08130628187576562776e-03
|
|
40
|
+
|
|
41
|
+
// 0x3F215DC9221C1A10
|
|
42
|
+
let qq4: number = 1.32494738004321644526e-04
|
|
43
|
+
|
|
44
|
+
// 0xBED09C4342A26120
|
|
45
|
+
let qq5: number = -3.96022827877536812320e-06
|
|
46
|
+
|
|
47
|
+
// Coefficients for approximation to erf in [0.84375, 1.25]
|
|
48
|
+
// 0xBF6359B8BEF77538
|
|
49
|
+
let pa0: number = -2.36211856075265944077e-03
|
|
50
|
+
|
|
51
|
+
// 0x3FDA8D00AD92B34D
|
|
52
|
+
let pa1: number = 4.14856118683748331666e-01
|
|
53
|
+
|
|
54
|
+
// 0xBFD7D240FBB8C3F1
|
|
55
|
+
let pa2: number = -3.72207876035701323847e-01
|
|
56
|
+
|
|
57
|
+
// 0x3FD45FCA805120E4
|
|
58
|
+
let pa3: number = 3.18346619901161753674e-01
|
|
59
|
+
|
|
60
|
+
// 0xBFBC63983D3E28EC
|
|
61
|
+
let pa4: number = -1.10894694282396677476e-01
|
|
62
|
+
|
|
63
|
+
// 0x3FA22A36599795EB
|
|
64
|
+
let pa5: number = 3.54783043256182359371e-02
|
|
65
|
+
|
|
66
|
+
// 0xBF61BF380A96073F
|
|
67
|
+
let pa6: number = -2.16637559486879084300e-03
|
|
68
|
+
|
|
69
|
+
// 0x3FBB3E6618EEE323
|
|
70
|
+
let qa1: number = 1.06420880400844228286e-01
|
|
71
|
+
|
|
72
|
+
// 0x3FE14AF092EB6F33
|
|
73
|
+
let qa2: number = 5.40397917702171048937e-01
|
|
74
|
+
|
|
75
|
+
// 0x3FB2635CD99FE9A7
|
|
76
|
+
let qa3: number = 7.18286544141962662868e-02
|
|
77
|
+
|
|
78
|
+
// 0x3FC02660E763351F
|
|
79
|
+
let qa4: number = 1.26171219808761642112e-01
|
|
80
|
+
|
|
81
|
+
// 0x3F8BEDC26B51DD1C
|
|
82
|
+
let qa5: number = 1.36370839120290507362e-02
|
|
83
|
+
|
|
84
|
+
// 0x3F888B545735151D
|
|
85
|
+
let qa6: number = 1.19844998467991074170e-02
|
|
86
|
+
|
|
87
|
+
// Coefficients for approximation to erfc in [1.25, 1/0.35]
|
|
88
|
+
// 0xBF843412600D6435
|
|
89
|
+
let ra0: number = -9.86494403484714822705e-03
|
|
90
|
+
|
|
91
|
+
// 0xBFE63416E4BA7360
|
|
92
|
+
let ra1: number = -6.93858572707181764372e-01
|
|
93
|
+
|
|
94
|
+
// 0xC0251E0441B0E726
|
|
95
|
+
let ra2: number = -1.05586262253232909814e+01
|
|
96
|
+
|
|
97
|
+
// 0xC04F300AE4CBA38D
|
|
98
|
+
let ra3: number = -6.23753324503260060396e+01
|
|
99
|
+
|
|
100
|
+
// 0xC0644CB184282266
|
|
101
|
+
let ra4: number = -1.62396669462573470355e+02
|
|
102
|
+
|
|
103
|
+
// 0xC067135CEBCCABB2
|
|
104
|
+
let ra5: number = -1.84605092906711035994e+02
|
|
105
|
+
|
|
106
|
+
// 0xC054526557E4D2F2
|
|
107
|
+
let ra6: number = -8.12874355063065934246e+01
|
|
108
|
+
|
|
109
|
+
// 0xC023A0EFC69AC25C
|
|
110
|
+
let ra7: number = -9.81432934416914548592e+00
|
|
111
|
+
|
|
112
|
+
// 0x4033A6B9BD707687
|
|
113
|
+
let sa1: number = 1.96512716674392571292e+01
|
|
114
|
+
|
|
115
|
+
// 0x4061350C526AE721
|
|
116
|
+
let sa2: number = 1.37657754143519042600e+02
|
|
117
|
+
|
|
118
|
+
// 0x407B290DD58A1A71
|
|
119
|
+
let sa3: number = 4.34565877475229228821e+02
|
|
120
|
+
|
|
121
|
+
// 0x40842B1921EC2868
|
|
122
|
+
let sa4: number = 6.45387271733267880336e+02
|
|
123
|
+
|
|
124
|
+
// 0x407AD02157700314
|
|
125
|
+
let sa5: number = 4.29008140027567833386e+02
|
|
126
|
+
|
|
127
|
+
// 0x405B28A3EE48AE2C
|
|
128
|
+
let sa6: number = 1.08635005541779435134e+02
|
|
129
|
+
|
|
130
|
+
// 0x401A47EF8E484A93
|
|
131
|
+
let sa7: number = 6.57024977031928170135e+00
|
|
132
|
+
|
|
133
|
+
// 0xBFAEEFF2EE749A62
|
|
134
|
+
let sa8: number = -6.04244152148580987438e-02
|
|
135
|
+
|
|
136
|
+
// Coefficients for approximation to erfc in [1/.35, 28]
|
|
137
|
+
// 0xBF84341239E86F4A
|
|
138
|
+
let rb0: number = -9.86494292470009928597e-03
|
|
139
|
+
|
|
140
|
+
// 0xBFE993BA70C285DE
|
|
141
|
+
let rb1: number = -7.99283237680523006574e-01
|
|
142
|
+
|
|
143
|
+
// 0xC031C209555F995A
|
|
144
|
+
let rb2: number = -1.77579549177547519889e+01
|
|
145
|
+
|
|
146
|
+
// 0xC064145D43C5ED98
|
|
147
|
+
let rb3: number = -1.60636384855821916062e+02
|
|
148
|
+
|
|
149
|
+
// 0xC083EC881375F228
|
|
150
|
+
let rb4: number = -6.37566443368389627722e+02
|
|
151
|
+
|
|
152
|
+
// 0xC09004616A2E5992
|
|
153
|
+
let rb5: number = -1.02509513161107724954e+03
|
|
154
|
+
|
|
155
|
+
// 0xC07E384E9BDC383F
|
|
156
|
+
let rb6: number = -4.83519191608651397019e+02
|
|
157
|
+
|
|
158
|
+
// 0x403E568B261D5190
|
|
159
|
+
let sb1: number = 3.03380607434824582924e+01
|
|
160
|
+
|
|
161
|
+
// 0x40745CAE221B9F0A
|
|
162
|
+
let sb2: number = 3.25792512996573918826e+02
|
|
163
|
+
|
|
164
|
+
// 0x409802EB189D5118
|
|
165
|
+
let sb3: number = 1.53672958608443695994e+03
|
|
166
|
+
|
|
167
|
+
// 0x40A8FFB7688C246A
|
|
168
|
+
let sb4: number = 3.19985821950859553908e+03
|
|
169
|
+
|
|
170
|
+
// 0x40A3F219CEDF3BE6
|
|
171
|
+
let sb5: number = 2.55305040643316442583e+03
|
|
172
|
+
|
|
173
|
+
// 0x407DA874E79FE763
|
|
174
|
+
let sb6: number = 4.74528541206955367215e+02
|
|
175
|
+
|
|
176
|
+
// 0xC03670E242712D62
|
|
177
|
+
let sb7: number = -2.24409524465858183362e+01
|
|
178
|
+
|
|
179
|
+
// Erf returns the error function of x.
|
|
180
|
+
//
|
|
181
|
+
// Special cases are:
|
|
182
|
+
//
|
|
183
|
+
// Erf(+Inf) = 1
|
|
184
|
+
// Erf(-Inf) = -1
|
|
185
|
+
// Erf(NaN) = NaN
|
|
186
|
+
export function Erf(x: number): number {
|
|
187
|
+
return erf(x)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function erf(x: number): number {
|
|
191
|
+
|
|
192
|
+
// 0x0080000000000000
|
|
193
|
+
// 2**-28
|
|
194
|
+
// 0x0080000000000000
|
|
195
|
+
let VeryTiny: number = 2.848094538889218e-306
|
|
196
|
+
// 2**-28
|
|
197
|
+
let Small: number = 1.0 / ((1 << 28))
|
|
198
|
+
// special cases
|
|
199
|
+
switch (true) {
|
|
200
|
+
case IsNaN(x):
|
|
201
|
+
return NaN()
|
|
202
|
+
break
|
|
203
|
+
case IsInf(x, 1):
|
|
204
|
+
return 1
|
|
205
|
+
break
|
|
206
|
+
case IsInf(x, -1):
|
|
207
|
+
return -1
|
|
208
|
+
break
|
|
209
|
+
}
|
|
210
|
+
let sign = false
|
|
211
|
+
if (x < 0) {
|
|
212
|
+
x = -x
|
|
213
|
+
sign = true
|
|
214
|
+
}
|
|
215
|
+
// |x| < 0.84375
|
|
216
|
+
|
|
217
|
+
// |x| < 2**-28
|
|
218
|
+
|
|
219
|
+
// avoid underflow
|
|
220
|
+
if (x < 0.84375) {
|
|
221
|
+
// |x| < 0.84375
|
|
222
|
+
let temp: number = 0
|
|
223
|
+
// |x| < 2**-28
|
|
224
|
+
|
|
225
|
+
// avoid underflow
|
|
226
|
+
if (x < 3.72529e-09) {
|
|
227
|
+
// |x| < 2**-28
|
|
228
|
+
|
|
229
|
+
// avoid underflow
|
|
230
|
+
if (x < 2.84809e-306) {
|
|
231
|
+
temp = 0.125 * (8.0 * x + 1.02703 * x) // avoid underflow
|
|
232
|
+
} else {
|
|
233
|
+
temp = x + 0.128379 * x
|
|
234
|
+
}
|
|
235
|
+
} else {
|
|
236
|
+
let z = x * x
|
|
237
|
+
let r = 0.128379 + z * (-0.325042 + z * (-0.0284817 + z * (-0.00577027 + z * -2.3763e-05)))
|
|
238
|
+
let s = 1 + z * (0.397917 + z * (0.0650222 + z * (0.00508131 + z * (0.000132495 + z * -3.96023e-06))))
|
|
239
|
+
let y = r / s
|
|
240
|
+
temp = x + x * y
|
|
241
|
+
}
|
|
242
|
+
if (sign) {
|
|
243
|
+
return -temp
|
|
244
|
+
}
|
|
245
|
+
return temp
|
|
246
|
+
}
|
|
247
|
+
// 0.84375 <= |x| < 1.25
|
|
248
|
+
if (x < 1.25) {
|
|
249
|
+
// 0.84375 <= |x| < 1.25
|
|
250
|
+
let s = x - 1
|
|
251
|
+
let P = -0.00236212 + s * (0.414856 + s * (-0.372208 + s * (0.318347 + s * (-0.110895 + s * (0.0354783 + s * -0.00216638)))))
|
|
252
|
+
let Q = 1 + s * (0.106421 + s * (0.540398 + s * (0.0718287 + s * (0.126171 + s * (0.0136371 + s * 0.0119845)))))
|
|
253
|
+
if (sign) {
|
|
254
|
+
return -0.845063 - P / Q
|
|
255
|
+
}
|
|
256
|
+
return 0.845063 + P / Q
|
|
257
|
+
}
|
|
258
|
+
// inf > |x| >= 6
|
|
259
|
+
if (x >= 6) {
|
|
260
|
+
// inf > |x| >= 6
|
|
261
|
+
if (sign) {
|
|
262
|
+
return -1
|
|
263
|
+
}
|
|
264
|
+
return 1
|
|
265
|
+
}
|
|
266
|
+
let s = 1 / (x * x)
|
|
267
|
+
let R: number
|
|
268
|
+
let S: number
|
|
269
|
+
// |x| < 1 / 0.35 ~ 2.857143
|
|
270
|
+
|
|
271
|
+
// |x| >= 1 / 0.35 ~ 2.857143
|
|
272
|
+
if (x < 1 / 0.35) {
|
|
273
|
+
// |x| < 1 / 0.35 ~ 2.857143
|
|
274
|
+
R = -0.00986494 + s * (-0.693859 + s * (-10.5586 + s * (-62.3753 + s * (-162.397 + s * (-184.605 + s * (-81.2874 + s * -9.81433))))))
|
|
275
|
+
S = 1 + s * (19.6513 + s * (137.658 + s * (434.566 + s * (645.387 + s * (429.008 + s * (108.635 + s * (6.57025 + s * -0.0604244)))))))
|
|
276
|
+
} else {
|
|
277
|
+
// |x| >= 1 / 0.35 ~ 2.857143
|
|
278
|
+
R = -0.00986494 + s * (-0.799283 + s * (-17.758 + s * (-160.636 + s * (-637.566 + s * (-1025.1 + s * -483.519)))))
|
|
279
|
+
S = 1 + s * (30.3381 + s * (325.793 + s * (1536.73 + s * (3199.86 + s * (2553.05 + s * (474.529 + s * -22.441))))))
|
|
280
|
+
}
|
|
281
|
+
let z = Float64frombits((Float64bits(x) & 0xffffffff00000000)) // pseudo-single (20-bit) precision x
|
|
282
|
+
let r = Exp(-z * z - 0.5625) * Exp((z - x) * (z + x) + R / S)
|
|
283
|
+
if (sign) {
|
|
284
|
+
return r / x - 1
|
|
285
|
+
}
|
|
286
|
+
return 1 - r / x
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Erfc returns the complementary error function of x.
|
|
290
|
+
//
|
|
291
|
+
// Special cases are:
|
|
292
|
+
//
|
|
293
|
+
// Erfc(+Inf) = 0
|
|
294
|
+
// Erfc(-Inf) = 2
|
|
295
|
+
// Erfc(NaN) = NaN
|
|
296
|
+
export function Erfc(x: number): number {
|
|
297
|
+
return erfc(x)
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
export function erfc(x: number): number {
|
|
301
|
+
// 2**-56
|
|
302
|
+
let Tiny: number = 1.0 / ((1 << 56))
|
|
303
|
+
// special cases
|
|
304
|
+
switch (true) {
|
|
305
|
+
case IsNaN(x):
|
|
306
|
+
return NaN()
|
|
307
|
+
break
|
|
308
|
+
case IsInf(x, 1):
|
|
309
|
+
return 0
|
|
310
|
+
break
|
|
311
|
+
case IsInf(x, -1):
|
|
312
|
+
return 2
|
|
313
|
+
break
|
|
314
|
+
}
|
|
315
|
+
let sign = false
|
|
316
|
+
if (x < 0) {
|
|
317
|
+
x = -x
|
|
318
|
+
sign = true
|
|
319
|
+
}
|
|
320
|
+
// |x| < 0.84375
|
|
321
|
+
|
|
322
|
+
// |x| < 2**-56
|
|
323
|
+
|
|
324
|
+
// |x| < 1/4
|
|
325
|
+
if (x < 0.84375) {
|
|
326
|
+
// |x| < 0.84375
|
|
327
|
+
let temp: number = 0
|
|
328
|
+
// |x| < 2**-56
|
|
329
|
+
|
|
330
|
+
// |x| < 1/4
|
|
331
|
+
if (x < 1.38778e-17) {
|
|
332
|
+
// |x| < 2**-56
|
|
333
|
+
temp = x
|
|
334
|
+
} else {
|
|
335
|
+
let z = x * x
|
|
336
|
+
let r = 0.128379 + z * (-0.325042 + z * (-0.0284817 + z * (-0.00577027 + z * -2.3763e-05)))
|
|
337
|
+
let s = 1 + z * (0.397917 + z * (0.0650222 + z * (0.00508131 + z * (0.000132495 + z * -3.96023e-06))))
|
|
338
|
+
let y = r / s
|
|
339
|
+
// |x| < 1/4
|
|
340
|
+
if (x < 0.25) {
|
|
341
|
+
// |x| < 1/4
|
|
342
|
+
temp = x + x * y
|
|
343
|
+
} else {
|
|
344
|
+
temp = 0.5 + (x * y + (x - 0.5))
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
if (sign) {
|
|
348
|
+
return 1 + temp
|
|
349
|
+
}
|
|
350
|
+
return 1 - temp
|
|
351
|
+
}
|
|
352
|
+
// 0.84375 <= |x| < 1.25
|
|
353
|
+
if (x < 1.25) {
|
|
354
|
+
// 0.84375 <= |x| < 1.25
|
|
355
|
+
let s = x - 1
|
|
356
|
+
let P = -0.00236212 + s * (0.414856 + s * (-0.372208 + s * (0.318347 + s * (-0.110895 + s * (0.0354783 + s * -0.00216638)))))
|
|
357
|
+
let Q = 1 + s * (0.106421 + s * (0.540398 + s * (0.0718287 + s * (0.126171 + s * (0.0136371 + s * 0.0119845)))))
|
|
358
|
+
if (sign) {
|
|
359
|
+
return 1 + 0.845063 + P / Q
|
|
360
|
+
}
|
|
361
|
+
return 1 - 0.845063 - P / Q
|
|
362
|
+
|
|
363
|
+
}
|
|
364
|
+
// |x| < 28
|
|
365
|
+
|
|
366
|
+
// |x| < 1 / 0.35 ~ 2.857143
|
|
367
|
+
|
|
368
|
+
// |x| >= 1 / 0.35 ~ 2.857143
|
|
369
|
+
|
|
370
|
+
// x < -6
|
|
371
|
+
|
|
372
|
+
// pseudo-single (20-bit) precision x
|
|
373
|
+
if (x < 28) {
|
|
374
|
+
// |x| < 28
|
|
375
|
+
let s = 1 / (x * x)
|
|
376
|
+
let R: number
|
|
377
|
+
let S: number
|
|
378
|
+
// |x| < 1 / 0.35 ~ 2.857143
|
|
379
|
+
|
|
380
|
+
// |x| >= 1 / 0.35 ~ 2.857143
|
|
381
|
+
|
|
382
|
+
// x < -6
|
|
383
|
+
if (x < 1 / 0.35) {
|
|
384
|
+
// |x| < 1 / 0.35 ~ 2.857143
|
|
385
|
+
R = -0.00986494 + s * (-0.693859 + s * (-10.5586 + s * (-62.3753 + s * (-162.397 + s * (-184.605 + s * (-81.2874 + s * -9.81433))))))
|
|
386
|
+
S = 1 + s * (19.6513 + s * (137.658 + s * (434.566 + s * (645.387 + s * (429.008 + s * (108.635 + s * (6.57025 + s * -0.0604244)))))))
|
|
387
|
+
} else {
|
|
388
|
+
// |x| >= 1 / 0.35 ~ 2.857143
|
|
389
|
+
|
|
390
|
+
// x < -6
|
|
391
|
+
if (sign && x > 6) {
|
|
392
|
+
return 2
|
|
393
|
+
}
|
|
394
|
+
R = -0.00986494 + s * (-0.799283 + s * (-17.758 + s * (-160.636 + s * (-637.566 + s * (-1025.1 + s * -483.519)))))
|
|
395
|
+
S = 1 + s * (30.3381 + s * (325.793 + s * (1536.73 + s * (3199.86 + s * (2553.05 + s * (474.529 + s * -22.441))))))
|
|
396
|
+
}
|
|
397
|
+
let z = Float64frombits((Float64bits(x) & 0xffffffff00000000)) // pseudo-single (20-bit) precision x
|
|
398
|
+
let r = Exp(-z * z - 0.5625) * Exp((z - x) * (z + x) + R / S)
|
|
399
|
+
if (sign) {
|
|
400
|
+
return 2 - r / x
|
|
401
|
+
}
|
|
402
|
+
return r / x
|
|
403
|
+
}
|
|
404
|
+
if (sign) {
|
|
405
|
+
return 2
|
|
406
|
+
}
|
|
407
|
+
return 0
|
|
408
|
+
}
|
|
409
|
+
|