goscript 0.0.37 → 0.0.39
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 +129 -8
- package/compiler/compiler.go +4 -1
- package/compiler/composite-lit.go +2 -4
- package/compiler/expr-call.go +12 -0
- package/compiler/lit.go +100 -6
- package/compiler/protobuf.go +2 -2
- package/compiler/spec-value.go +3 -3
- package/compiler/spec.go +6 -3
- package/compiler/stmt-assign.go +1 -1
- package/dist/gs/builtin/builtin.d.ts +45 -0
- package/dist/gs/builtin/builtin.js +197 -0
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/slice.js +2 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.d.ts +56 -0
- package/dist/gs/bytes/buffer.gs.js +611 -0
- package/dist/gs/bytes/buffer.gs.js.map +1 -0
- package/dist/gs/bytes/bytes.gs.d.ts +78 -0
- package/dist/gs/bytes/bytes.gs.js +1011 -0
- package/dist/gs/bytes/bytes.gs.js.map +1 -0
- package/dist/gs/bytes/index.d.ts +4 -0
- package/dist/gs/bytes/index.js +5 -0
- package/dist/gs/bytes/index.js.map +1 -0
- package/dist/gs/bytes/iter.gs.d.ts +9 -0
- package/dist/gs/bytes/iter.gs.js +143 -0
- package/dist/gs/bytes/iter.gs.js.map +1 -0
- package/dist/gs/bytes/reader.gs.d.ts +34 -0
- package/dist/gs/bytes/reader.gs.js +198 -0
- package/dist/gs/bytes/reader.gs.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/errors.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +182 -23
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/go113.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/go113.js +1 -1
- package/dist/gs/github.com/pkg/errors/go113.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/index.d.ts +3 -3
- package/dist/gs/github.com/pkg/errors/index.js +3 -3
- package/dist/gs/github.com/pkg/errors/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js +8 -5
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- package/dist/gs/internal/abi/index.d.ts +20 -0
- package/dist/gs/internal/abi/index.js +20 -0
- package/dist/gs/internal/abi/index.js.map +1 -0
- package/dist/gs/internal/bytealg/index.d.ts +14 -0
- package/dist/gs/internal/bytealg/index.js +139 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -0
- package/dist/gs/internal/byteorder/index.d.ts +1 -1
- package/dist/gs/internal/byteorder/index.js +4 -4
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/math/index.d.ts +44 -44
- package/dist/gs/math/index.js +44 -44
- package/dist/gs/math/index.js.map +1 -1
- package/dist/gs/os/index.d.ts +19 -19
- package/dist/gs/os/index.js +19 -19
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/reflect/deepequal.d.ts +2 -0
- package/dist/gs/reflect/deepequal.js +91 -0
- package/dist/gs/reflect/deepequal.js.map +1 -0
- package/dist/gs/reflect/index.d.ts +8 -0
- package/dist/gs/reflect/index.js +10 -0
- package/dist/gs/reflect/index.js.map +1 -0
- package/dist/gs/reflect/iter.d.ts +4 -0
- package/dist/gs/reflect/iter.js +24 -0
- package/dist/gs/reflect/iter.js.map +1 -0
- package/dist/gs/reflect/map.d.ts +20 -0
- package/dist/gs/reflect/map.js +74 -0
- package/dist/gs/reflect/map.js.map +1 -0
- package/dist/gs/reflect/swapper.d.ts +2 -0
- package/dist/gs/reflect/swapper.js +46 -0
- package/dist/gs/reflect/swapper.js.map +1 -0
- package/dist/gs/reflect/type.d.ts +134 -0
- package/dist/gs/reflect/type.js +825 -0
- package/dist/gs/reflect/type.js.map +1 -0
- package/dist/gs/reflect/types.d.ts +90 -0
- package/dist/gs/reflect/types.js +119 -0
- package/dist/gs/reflect/types.js.map +1 -0
- package/dist/gs/reflect/value.d.ts +13 -0
- package/dist/gs/reflect/value.js +202 -0
- package/dist/gs/reflect/value.js.map +1 -0
- package/dist/gs/reflect/visiblefields.d.ts +4 -0
- package/dist/gs/reflect/visiblefields.js +149 -0
- package/dist/gs/reflect/visiblefields.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +6 -6
- package/dist/gs/strconv/index.js +6 -6
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/index.d.ts +1 -1
- package/dist/gs/strings/index.js +1 -1
- package/dist/gs/strings/index.js.map +1 -1
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/sync/atomic/index.d.ts +4 -4
- package/dist/gs/sync/atomic/index.js +4 -4
- package/dist/gs/sync/atomic/index.js.map +1 -1
- package/dist/gs/syscall/index.d.ts +6 -6
- package/dist/gs/syscall/index.js +34 -28
- package/dist/gs/syscall/index.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +1 -1
- package/dist/gs/unicode/utf8/utf8.js +4 -2
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unsafe/unsafe.js.map +1 -1
- package/gs/builtin/builtin.ts +219 -0
- package/gs/builtin/slice.ts +2 -1
- package/gs/bytes/buffer.gs.ts +614 -0
- package/gs/bytes/bytes.gs.ts +1180 -0
- package/gs/bytes/godoc.txt +69 -0
- package/gs/bytes/index.ts +69 -0
- package/gs/bytes/iter.gs.ts +149 -0
- package/gs/bytes/reader.gs.ts +230 -0
- package/gs/github.com/pkg/errors/errors.ts +408 -238
- package/gs/github.com/pkg/errors/go113.ts +5 -6
- package/gs/github.com/pkg/errors/index.ts +12 -3
- package/gs/github.com/pkg/errors/stack.ts +107 -105
- package/gs/internal/abi/index.ts +37 -0
- package/gs/internal/bytealg/index.ts +149 -0
- package/gs/internal/byteorder/index.ts +5 -5
- package/gs/math/abs.gs.test.ts +1 -1
- package/gs/math/acosh.gs.test.ts +4 -2
- package/gs/math/asin.gs.test.ts +1 -1
- package/gs/math/asinh.gs.test.ts +7 -3
- package/gs/math/atan.gs.test.ts +1 -1
- package/gs/math/atan2.gs.test.ts +17 -9
- package/gs/math/atanh.gs.test.ts +1 -1
- package/gs/math/bits.gs.test.ts +1 -1
- package/gs/math/cbrt.gs.test.ts +1 -1
- package/gs/math/const.gs.test.ts +34 -8
- package/gs/math/copysign.gs.test.ts +7 -3
- package/gs/math/dim.gs.test.ts +19 -7
- package/gs/math/erf.gs.test.ts +1 -1
- package/gs/math/erfinv.gs.test.ts +4 -2
- package/gs/math/exp.gs.test.ts +1 -1
- package/gs/math/expm1.gs.test.ts +6 -4
- package/gs/math/floor.gs.test.ts +17 -4
- package/gs/math/fma.gs.test.ts +53 -53
- package/gs/math/frexp.gs.test.ts +112 -117
- package/gs/math/gamma.gs.test.ts +1 -1
- package/gs/math/hypot.gs.test.ts +53 -53
- package/gs/math/index.ts +80 -44
- package/gs/math/j0.gs.test.ts +6 -2
- package/gs/math/j1.gs.test.ts +6 -2
- package/gs/math/jn.gs.test.ts +9 -5
- package/gs/math/ldexp.gs.test.ts +103 -86
- package/gs/math/lgamma.gs.test.ts +10 -10
- package/gs/math/log.gs.test.ts +1 -1
- package/gs/math/log10.gs.test.ts +1 -1
- package/gs/math/log1p.gs.test.ts +2 -2
- package/gs/math/logb.gs.test.ts +1 -1
- package/gs/math/mod.gs.test.ts +2 -2
- package/gs/math/modf.gs.test.ts +7 -7
- package/gs/math/nextafter.gs.test.ts +9 -7
- package/gs/math/pow.gs.test.ts +6 -4
- package/gs/math/pow10.gs.test.ts +1 -1
- package/gs/math/remainder.gs.test.ts +1 -1
- package/gs/math/signbit.gs.test.ts +1 -1
- package/gs/math/sin.gs.test.ts +1 -1
- package/gs/math/sincos.gs.test.ts +33 -14
- package/gs/math/sinh.gs.test.ts +1 -1
- package/gs/math/sqrt.gs.test.ts +1 -1
- package/gs/math/tan.gs.test.ts +3 -3
- package/gs/math/tanh.gs.test.ts +1 -1
- package/gs/os/index.ts +128 -19
- package/gs/reflect/ANALYSIS.md +278 -0
- package/gs/reflect/deepequal.test.ts +41 -0
- package/gs/reflect/deepequal.ts +169 -0
- package/gs/reflect/function-types.test.ts +146 -0
- package/gs/reflect/godoc.txt +67 -0
- package/gs/reflect/index.ts +83 -0
- package/gs/reflect/iter.ts +44 -0
- package/gs/reflect/map.test.ts +30 -0
- package/gs/reflect/map.ts +85 -0
- package/gs/reflect/swapper.ts +52 -0
- package/gs/reflect/type.ts +1016 -0
- package/gs/reflect/types.ts +214 -0
- package/gs/reflect/value.ts +270 -0
- package/gs/reflect/visiblefields.ts +177 -0
- package/gs/strconv/index.ts +39 -6
- package/gs/strings/index.ts +7 -1
- package/gs/strings/replace.ts +1 -9
- package/gs/sync/atomic/index.ts +53 -4
- package/gs/syscall/index.ts +45 -37
- package/gs/unicode/utf8/utf8.ts +8 -5
- package/gs/unsafe/unsafe.ts +1 -1
- package/package.json +2 -1
- package/dist/gs/internal/testlog/index.d.ts +0 -1
- package/dist/gs/internal/testlog/index.js +0 -5
- package/dist/gs/internal/testlog/index.js.map +0 -1
- package/dist/gs/maps/iter.gs.d.ts +0 -7
- package/dist/gs/maps/iter.gs.js +0 -65
- package/dist/gs/maps/iter.gs.js.map +0 -1
- package/dist/gs/maps/maps.gs.d.ts +0 -7
- package/dist/gs/maps/maps.gs.js +0 -79
- package/dist/gs/maps/maps.gs.js.map +0 -1
- package/dist/gs/stringslite/index.d.ts +0 -1
- package/dist/gs/stringslite/index.js +0 -2
- package/dist/gs/stringslite/index.js.map +0 -1
- package/dist/gs/stringslite/strings.d.ts +0 -11
- package/dist/gs/stringslite/strings.js +0 -67
- package/dist/gs/stringslite/strings.js.map +0 -1
- package/gs/internal/testlog/index.ts +0 -7
package/gs/math/const.gs.test.ts
CHANGED
|
@@ -1,9 +1,35 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
2
|
import {
|
|
3
|
-
E,
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
E,
|
|
4
|
+
Pi,
|
|
5
|
+
Phi,
|
|
6
|
+
Sqrt2,
|
|
7
|
+
SqrtE,
|
|
8
|
+
SqrtPi,
|
|
9
|
+
SqrtPhi,
|
|
10
|
+
Ln2,
|
|
11
|
+
Log2E,
|
|
12
|
+
Ln10,
|
|
13
|
+
Log10E,
|
|
14
|
+
MaxFloat32,
|
|
15
|
+
SmallestNonzeroFloat32,
|
|
16
|
+
MaxFloat64,
|
|
17
|
+
SmallestNonzeroFloat64,
|
|
18
|
+
MaxInt,
|
|
19
|
+
MinInt,
|
|
20
|
+
MaxInt8,
|
|
21
|
+
MinInt8,
|
|
22
|
+
MaxInt16,
|
|
23
|
+
MinInt16,
|
|
24
|
+
MaxInt32,
|
|
25
|
+
MinInt32,
|
|
26
|
+
MaxInt64,
|
|
27
|
+
MinInt64,
|
|
28
|
+
MaxUint,
|
|
29
|
+
MaxUint8,
|
|
30
|
+
MaxUint16,
|
|
31
|
+
MaxUint32,
|
|
32
|
+
MaxUint64,
|
|
7
33
|
} from './const.gs.js'
|
|
8
34
|
|
|
9
35
|
describe('Mathematical Constants', () => {
|
|
@@ -25,7 +51,7 @@ describe('Mathematical Constants', () => {
|
|
|
25
51
|
})
|
|
26
52
|
|
|
27
53
|
it('should have correct float limits', () => {
|
|
28
|
-
expect(MaxFloat32).toBe(3.
|
|
54
|
+
expect(MaxFloat32).toBe(3.4028234663852886e38)
|
|
29
55
|
expect(SmallestNonzeroFloat32).toBe(1.401298464324817e-45)
|
|
30
56
|
expect(MaxFloat64).toBe(Number.MAX_VALUE)
|
|
31
57
|
expect(SmallestNonzeroFloat64).toBe(Number.MIN_VALUE)
|
|
@@ -48,7 +74,7 @@ describe('Mathematical Constants', () => {
|
|
|
48
74
|
expect(MinInt).toBe(-9223372036854775808n)
|
|
49
75
|
expect(MaxInt64).toBe(9223372036854775807n)
|
|
50
76
|
expect(MinInt64).toBe(-9223372036854775808n)
|
|
51
|
-
expect(MaxUint).toBe(
|
|
52
|
-
expect(MaxUint64).toBe(
|
|
77
|
+
expect(MaxUint).toBe(0xffffffffffffffffn)
|
|
78
|
+
expect(MaxUint64).toBe(0xffffffffffffffffn)
|
|
53
79
|
})
|
|
54
|
-
})
|
|
80
|
+
})
|
|
@@ -18,9 +18,13 @@ describe('Copysign', () => {
|
|
|
18
18
|
|
|
19
19
|
it('should handle infinity values', () => {
|
|
20
20
|
expect(Copysign(Number.POSITIVE_INFINITY, 1)).toBe(Number.POSITIVE_INFINITY)
|
|
21
|
-
expect(Copysign(Number.POSITIVE_INFINITY, -1)).toBe(
|
|
21
|
+
expect(Copysign(Number.POSITIVE_INFINITY, -1)).toBe(
|
|
22
|
+
Number.NEGATIVE_INFINITY,
|
|
23
|
+
)
|
|
22
24
|
expect(Copysign(Number.NEGATIVE_INFINITY, 1)).toBe(Number.POSITIVE_INFINITY)
|
|
23
|
-
expect(Copysign(Number.NEGATIVE_INFINITY, -1)).toBe(
|
|
25
|
+
expect(Copysign(Number.NEGATIVE_INFINITY, -1)).toBe(
|
|
26
|
+
Number.NEGATIVE_INFINITY,
|
|
27
|
+
)
|
|
24
28
|
})
|
|
25
29
|
|
|
26
30
|
it('should handle NaN values', () => {
|
|
@@ -41,4 +45,4 @@ describe('Copysign', () => {
|
|
|
41
45
|
expect(Object.is(Copysign(-5, -0), -5)).toBe(true)
|
|
42
46
|
expect(Object.is(Copysign(0, -0), -0)).toBe(true)
|
|
43
47
|
})
|
|
44
|
-
})
|
|
48
|
+
})
|
package/gs/math/dim.gs.test.ts
CHANGED
|
@@ -11,8 +11,12 @@ describe('Dim', () => {
|
|
|
11
11
|
})
|
|
12
12
|
|
|
13
13
|
it('should handle special cases', () => {
|
|
14
|
-
expect(
|
|
15
|
-
|
|
14
|
+
expect(
|
|
15
|
+
Number.isNaN(Dim(Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY)),
|
|
16
|
+
).toBe(true)
|
|
17
|
+
expect(
|
|
18
|
+
Number.isNaN(Dim(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY)),
|
|
19
|
+
).toBe(true)
|
|
16
20
|
expect(Number.isNaN(Dim(5, Number.NaN))).toBe(true)
|
|
17
21
|
expect(Number.isNaN(Dim(Number.NaN, 5))).toBe(true)
|
|
18
22
|
})
|
|
@@ -50,7 +54,9 @@ describe('Max', () => {
|
|
|
50
54
|
it('should handle infinity cases', () => {
|
|
51
55
|
expect(Max(Number.NEGATIVE_INFINITY, 5)).toBe(5)
|
|
52
56
|
expect(Max(5, Number.NEGATIVE_INFINITY)).toBe(5)
|
|
53
|
-
expect(Max(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY)).toBe(
|
|
57
|
+
expect(Max(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY)).toBe(
|
|
58
|
+
Number.POSITIVE_INFINITY,
|
|
59
|
+
)
|
|
54
60
|
})
|
|
55
61
|
})
|
|
56
62
|
|
|
@@ -59,7 +65,9 @@ describe('max', () => {
|
|
|
59
65
|
expect(max(5, 3)).toBe(Max(5, 3))
|
|
60
66
|
expect(max(-5, -3)).toBe(Max(-5, -3))
|
|
61
67
|
expect(max(0, -0)).toBe(Max(0, -0))
|
|
62
|
-
expect(Number.isNaN(max(5, Number.NaN))).toBe(
|
|
68
|
+
expect(Number.isNaN(max(5, Number.NaN))).toBe(
|
|
69
|
+
Number.isNaN(Max(5, Number.NaN)),
|
|
70
|
+
)
|
|
63
71
|
})
|
|
64
72
|
})
|
|
65
73
|
|
|
@@ -88,7 +96,9 @@ describe('Min', () => {
|
|
|
88
96
|
it('should handle infinity cases', () => {
|
|
89
97
|
expect(Min(Number.POSITIVE_INFINITY, 5)).toBe(5)
|
|
90
98
|
expect(Min(5, Number.POSITIVE_INFINITY)).toBe(5)
|
|
91
|
-
expect(Min(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY)).toBe(
|
|
99
|
+
expect(Min(Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY)).toBe(
|
|
100
|
+
Number.NEGATIVE_INFINITY,
|
|
101
|
+
)
|
|
92
102
|
})
|
|
93
103
|
})
|
|
94
104
|
|
|
@@ -97,6 +107,8 @@ describe('min', () => {
|
|
|
97
107
|
expect(min(5, 3)).toBe(Min(5, 3))
|
|
98
108
|
expect(min(-5, -3)).toBe(Min(-5, -3))
|
|
99
109
|
expect(min(0, -0)).toBe(Min(0, -0))
|
|
100
|
-
expect(Number.isNaN(min(5, Number.NaN))).toBe(
|
|
110
|
+
expect(Number.isNaN(min(5, Number.NaN))).toBe(
|
|
111
|
+
Number.isNaN(Min(5, Number.NaN)),
|
|
112
|
+
)
|
|
101
113
|
})
|
|
102
|
-
})
|
|
114
|
+
})
|
package/gs/math/erf.gs.test.ts
CHANGED
|
@@ -30,7 +30,9 @@ describe('Erfinv', () => {
|
|
|
30
30
|
})
|
|
31
31
|
|
|
32
32
|
it('should be the inverse of Erf', () => {
|
|
33
|
-
const testValues = [
|
|
33
|
+
const testValues = [
|
|
34
|
+
0, 0.1, 0.3, 0.5, 0.7, 0.9, -0.1, -0.3, -0.5, -0.7, -0.9,
|
|
35
|
+
]
|
|
34
36
|
for (const x of testValues) {
|
|
35
37
|
const y = Erfinv(x)
|
|
36
38
|
// Relax precision tolerance for JavaScript floating-point differences
|
|
@@ -101,4 +103,4 @@ describe('Erfcinv', () => {
|
|
|
101
103
|
expect(Erfcinv(0.0001)).toBeGreaterThan(2.5)
|
|
102
104
|
expect(Erfcinv(1.9999)).toBeLessThan(-2.5)
|
|
103
105
|
})
|
|
104
|
-
})
|
|
106
|
+
})
|
package/gs/math/exp.gs.test.ts
CHANGED
package/gs/math/expm1.gs.test.ts
CHANGED
|
@@ -11,7 +11,7 @@ describe('Expm1', () => {
|
|
|
11
11
|
|
|
12
12
|
it('should return correct values for normal inputs', () => {
|
|
13
13
|
expect(Expm1(1)).toBeCloseTo(Math.E - 1, 15)
|
|
14
|
-
expect(Expm1(-1)).toBeCloseTo(1/Math.E - 1, 15)
|
|
14
|
+
expect(Expm1(-1)).toBeCloseTo(1 / Math.E - 1, 15)
|
|
15
15
|
expect(Expm1(2)).toBeCloseTo(Math.E * Math.E - 1, 14)
|
|
16
16
|
expect(Expm1(0.5)).toBeCloseTo(Math.sqrt(Math.E) - 1, 15)
|
|
17
17
|
})
|
|
@@ -31,9 +31,11 @@ describe('Expm1', () => {
|
|
|
31
31
|
const x = 1e-15
|
|
32
32
|
const expm1Result = Expm1(x)
|
|
33
33
|
const expMinus1Result = Math.exp(x) - 1
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
// For very small x, expm1 should be more accurate
|
|
36
|
-
expect(Math.abs(expm1Result - x)).toBeLessThan(
|
|
36
|
+
expect(Math.abs(expm1Result - x)).toBeLessThan(
|
|
37
|
+
Math.abs(expMinus1Result - x),
|
|
38
|
+
)
|
|
37
39
|
})
|
|
38
40
|
})
|
|
39
41
|
|
|
@@ -45,4 +47,4 @@ describe('expm1', () => {
|
|
|
45
47
|
expect(expm1(0.5)).toBe(Expm1(0.5))
|
|
46
48
|
expect(Number.isNaN(expm1(Number.NaN))).toBe(true)
|
|
47
49
|
})
|
|
48
|
-
})
|
|
50
|
+
})
|
package/gs/math/floor.gs.test.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
Floor,
|
|
4
|
+
floor,
|
|
5
|
+
Ceil,
|
|
6
|
+
ceil,
|
|
7
|
+
Trunc,
|
|
8
|
+
trunc,
|
|
9
|
+
Round,
|
|
10
|
+
RoundToEven,
|
|
11
|
+
} from './floor.gs.js'
|
|
3
12
|
|
|
4
13
|
describe('Floor', () => {
|
|
5
14
|
it('should return correct floor values', () => {
|
|
@@ -28,7 +37,9 @@ describe('floor', () => {
|
|
|
28
37
|
it('should work the same as Floor', () => {
|
|
29
38
|
expect(floor(4.8)).toBe(Floor(4.8))
|
|
30
39
|
expect(floor(-4.2)).toBe(Floor(-4.2))
|
|
31
|
-
expect(floor(Number.POSITIVE_INFINITY)).toBe(
|
|
40
|
+
expect(floor(Number.POSITIVE_INFINITY)).toBe(
|
|
41
|
+
Floor(Number.POSITIVE_INFINITY),
|
|
42
|
+
)
|
|
32
43
|
})
|
|
33
44
|
})
|
|
34
45
|
|
|
@@ -90,7 +101,9 @@ describe('trunc', () => {
|
|
|
90
101
|
it('should work the same as Trunc', () => {
|
|
91
102
|
expect(trunc(4.8)).toBe(Trunc(4.8))
|
|
92
103
|
expect(trunc(-4.2)).toBe(Trunc(-4.2))
|
|
93
|
-
expect(trunc(Number.POSITIVE_INFINITY)).toBe(
|
|
104
|
+
expect(trunc(Number.POSITIVE_INFINITY)).toBe(
|
|
105
|
+
Trunc(Number.POSITIVE_INFINITY),
|
|
106
|
+
)
|
|
94
107
|
})
|
|
95
108
|
})
|
|
96
109
|
|
|
@@ -143,4 +156,4 @@ describe('RoundToEven', () => {
|
|
|
143
156
|
expect(RoundToEven(0)).toBe(0)
|
|
144
157
|
expect(RoundToEven(-0)).toBe(-0)
|
|
145
158
|
})
|
|
146
|
-
})
|
|
159
|
+
})
|
package/gs/math/fma.gs.test.ts
CHANGED
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { FMA } from './fma.gs.js'
|
|
3
|
-
import { Inf, NaN as GoNaN, IsNaN } from './bits.gs.js'
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { FMA } from './fma.gs.js'
|
|
3
|
+
import { Inf, NaN as GoNaN, IsNaN } from './bits.gs.js'
|
|
4
4
|
|
|
5
5
|
describe('FMA', () => {
|
|
6
6
|
it('should compute fused multiply-add correctly for basic cases', () => {
|
|
7
|
-
expect(FMA(2, 3, 4)).toBe(10)
|
|
8
|
-
expect(FMA(1.5, 2, 0.5)).toBe(3.5)
|
|
9
|
-
expect(FMA(0.1, 0.2, 0.3)).toBeCloseTo(0.32, 10)
|
|
10
|
-
expect(FMA(-2, 3, 1)).toBe(-5)
|
|
11
|
-
})
|
|
7
|
+
expect(FMA(2, 3, 4)).toBe(10) // 2*3 + 4 = 10
|
|
8
|
+
expect(FMA(1.5, 2, 0.5)).toBe(3.5) // 1.5*2 + 0.5 = 3.5
|
|
9
|
+
expect(FMA(0.1, 0.2, 0.3)).toBeCloseTo(0.32, 10) // 0.1*0.2 + 0.3 = 0.32
|
|
10
|
+
expect(FMA(-2, 3, 1)).toBe(-5) // -2*3 + 1 = -5
|
|
11
|
+
})
|
|
12
12
|
|
|
13
13
|
it('should handle zero values', () => {
|
|
14
|
-
expect(FMA(0, 5, 3)).toBe(3)
|
|
15
|
-
expect(FMA(5, 0, 3)).toBe(3)
|
|
16
|
-
expect(FMA(5, 3, 0)).toBe(15)
|
|
17
|
-
expect(FMA(0, 0, 0)).toBe(0)
|
|
18
|
-
expect(FMA(0, 0, 5)).toBe(5)
|
|
19
|
-
})
|
|
14
|
+
expect(FMA(0, 5, 3)).toBe(3) // 0*5 + 3 = 3
|
|
15
|
+
expect(FMA(5, 0, 3)).toBe(3) // 5*0 + 3 = 3
|
|
16
|
+
expect(FMA(5, 3, 0)).toBe(15) // 5*3 + 0 = 15
|
|
17
|
+
expect(FMA(0, 0, 0)).toBe(0) // 0*0 + 0 = 0
|
|
18
|
+
expect(FMA(0, 0, 5)).toBe(5) // 0*0 + 5 = 5
|
|
19
|
+
})
|
|
20
20
|
|
|
21
21
|
it('should handle negative values', () => {
|
|
22
|
-
expect(FMA(-2, -3, 4)).toBe(10)
|
|
23
|
-
expect(FMA(-2, 3, -4)).toBe(-10)
|
|
24
|
-
expect(FMA(2, -3, -4)).toBe(-10)
|
|
25
|
-
expect(FMA(-2, -3, -4)).toBe(2)
|
|
26
|
-
})
|
|
22
|
+
expect(FMA(-2, -3, 4)).toBe(10) // -2*-3 + 4 = 10
|
|
23
|
+
expect(FMA(-2, 3, -4)).toBe(-10) // -2*3 + -4 = -10
|
|
24
|
+
expect(FMA(2, -3, -4)).toBe(-10) // 2*-3 + -4 = -10
|
|
25
|
+
expect(FMA(-2, -3, -4)).toBe(2) // -2*-3 + -4 = 2
|
|
26
|
+
})
|
|
27
27
|
|
|
28
28
|
it('should handle infinity cases', () => {
|
|
29
|
-
expect(FMA(Inf(1), 2, 3)).toBe(Inf(1))
|
|
30
|
-
expect(FMA(2, Inf(1), 3)).toBe(Inf(1))
|
|
31
|
-
expect(FMA(2, 3, Inf(1))).toBe(Inf(1))
|
|
32
|
-
expect(FMA(Inf(-1), 2, 3)).toBe(Inf(-1))
|
|
33
|
-
expect(FMA(Inf(1), Inf(1), 3)).toBe(Inf(1))
|
|
34
|
-
expect(FMA(Inf(-1), Inf(-1), 3)).toBe(Inf(1))
|
|
35
|
-
})
|
|
29
|
+
expect(FMA(Inf(1), 2, 3)).toBe(Inf(1)) // +Inf * 2 + 3 = +Inf
|
|
30
|
+
expect(FMA(2, Inf(1), 3)).toBe(Inf(1)) // 2 * +Inf + 3 = +Inf
|
|
31
|
+
expect(FMA(2, 3, Inf(1))).toBe(Inf(1)) // 2 * 3 + +Inf = +Inf
|
|
32
|
+
expect(FMA(Inf(-1), 2, 3)).toBe(Inf(-1)) // -Inf * 2 + 3 = -Inf
|
|
33
|
+
expect(FMA(Inf(1), Inf(1), 3)).toBe(Inf(1)) // +Inf * +Inf + 3 = +Inf
|
|
34
|
+
expect(FMA(Inf(-1), Inf(-1), 3)).toBe(Inf(1)) // -Inf * -Inf + 3 = +Inf
|
|
35
|
+
})
|
|
36
36
|
|
|
37
37
|
it('should handle NaN cases', () => {
|
|
38
|
-
expect(IsNaN(FMA(GoNaN(), 2, 3))).toBe(true)
|
|
39
|
-
expect(IsNaN(FMA(2, GoNaN(), 3))).toBe(true)
|
|
40
|
-
expect(IsNaN(FMA(2, 3, GoNaN()))).toBe(true)
|
|
41
|
-
expect(IsNaN(FMA(GoNaN(), GoNaN(), GoNaN()))).toBe(true)
|
|
42
|
-
})
|
|
38
|
+
expect(IsNaN(FMA(GoNaN(), 2, 3))).toBe(true)
|
|
39
|
+
expect(IsNaN(FMA(2, GoNaN(), 3))).toBe(true)
|
|
40
|
+
expect(IsNaN(FMA(2, 3, GoNaN()))).toBe(true)
|
|
41
|
+
expect(IsNaN(FMA(GoNaN(), GoNaN(), GoNaN()))).toBe(true)
|
|
42
|
+
})
|
|
43
43
|
|
|
44
44
|
it('should handle special infinity and zero combinations', () => {
|
|
45
45
|
// Inf * 0 should produce NaN
|
|
46
|
-
expect(IsNaN(FMA(Inf(1), 0, 5))).toBe(true)
|
|
47
|
-
expect(IsNaN(FMA(0, Inf(1), 5))).toBe(true)
|
|
48
|
-
|
|
46
|
+
expect(IsNaN(FMA(Inf(1), 0, 5))).toBe(true)
|
|
47
|
+
expect(IsNaN(FMA(0, Inf(1), 5))).toBe(true)
|
|
48
|
+
|
|
49
49
|
// But if the addition part is also infinity, behavior depends on implementation
|
|
50
|
-
expect(IsNaN(FMA(Inf(1), 0, Inf(1)))).toBe(true)
|
|
51
|
-
})
|
|
50
|
+
expect(IsNaN(FMA(Inf(1), 0, Inf(1)))).toBe(true)
|
|
51
|
+
})
|
|
52
52
|
|
|
53
53
|
it('should handle cancellation cases', () => {
|
|
54
54
|
// Cases where x*y and z cancel out
|
|
55
|
-
expect(FMA(2, 3, -6)).toBe(0)
|
|
56
|
-
expect(FMA(-5, 4, 20)).toBe(0)
|
|
57
|
-
expect(FMA(0.5, 0.2, -0.1)).toBeCloseTo(0, 10)
|
|
58
|
-
})
|
|
55
|
+
expect(FMA(2, 3, -6)).toBe(0) // 2*3 + (-6) = 0
|
|
56
|
+
expect(FMA(-5, 4, 20)).toBe(0) // -5*4 + 20 = 0
|
|
57
|
+
expect(FMA(0.5, 0.2, -0.1)).toBeCloseTo(0, 10) // 0.5*0.2 + (-0.1) = 0
|
|
58
|
+
})
|
|
59
59
|
|
|
60
60
|
it('should handle very large and small numbers', () => {
|
|
61
|
-
const large = 1e100
|
|
62
|
-
const small = 1e-100
|
|
63
|
-
|
|
61
|
+
const large = 1e100
|
|
62
|
+
const small = 1e-100
|
|
63
|
+
|
|
64
64
|
// Relax tolerance for very large/small number calculations
|
|
65
65
|
const result1 = FMA(large, small, 1)
|
|
66
|
-
expect(result1).toBeCloseTo(2, 0)
|
|
67
|
-
expect(FMA(small, small, large)).toBeCloseTo(large, 5)
|
|
68
|
-
expect(FMA(large, large, -large * large)).toBeCloseTo(0, 5)
|
|
69
|
-
})
|
|
66
|
+
expect(result1).toBeCloseTo(2, 0) // large*small is approximately 1, so result is approximately 2
|
|
67
|
+
expect(FMA(small, small, large)).toBeCloseTo(large, 5) // small*small is negligible
|
|
68
|
+
expect(FMA(large, large, -large * large)).toBeCloseTo(0, 5) // cancellation
|
|
69
|
+
})
|
|
70
70
|
|
|
71
71
|
it('should be equivalent to x * y + z for simple cases', () => {
|
|
72
72
|
const testCases = [
|
|
73
73
|
[1, 2, 3],
|
|
74
74
|
[0.5, 0.25, 0.125],
|
|
75
75
|
[-1, 2, -3],
|
|
76
|
-
[10, 0.1, 5]
|
|
77
|
-
]
|
|
76
|
+
[10, 0.1, 5],
|
|
77
|
+
]
|
|
78
78
|
|
|
79
79
|
testCases.forEach(([x, y, z]) => {
|
|
80
|
-
expect(FMA(x, y, z)).toBeCloseTo(x * y + z, 10)
|
|
81
|
-
})
|
|
82
|
-
})
|
|
83
|
-
})
|
|
80
|
+
expect(FMA(x, y, z)).toBeCloseTo(x * y + z, 10)
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
})
|
package/gs/math/frexp.gs.test.ts
CHANGED
|
@@ -1,146 +1,141 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { Frexp, frexp } from './frexp.gs.js'
|
|
3
|
-
import { Inf, NaN as GoNaN, IsNaN } from './bits.gs.js'
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { Frexp, frexp } from './frexp.gs.js'
|
|
3
|
+
import { Inf, NaN as GoNaN, IsNaN } from './bits.gs.js'
|
|
4
4
|
|
|
5
5
|
describe('Frexp', () => {
|
|
6
6
|
it('should break numbers into normalized fraction and exponent', () => {
|
|
7
7
|
// Test basic cases where we can verify the math
|
|
8
|
-
let [frac, exp] = Frexp(8)
|
|
9
|
-
expect(frac).toBeCloseTo(0.5, 10)
|
|
10
|
-
expect(exp).toBe(4)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
expect(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
expect(
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
expect(frac).toBeCloseTo(0.5, 10);
|
|
22
|
-
expect(exp).toBe(3); // 4 = 0.5 * 2^3
|
|
23
|
-
});
|
|
8
|
+
let [frac, exp] = Frexp(8)
|
|
9
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
10
|
+
expect(exp).toBe(4) // 8 = 0.5 * 2^4
|
|
11
|
+
;[frac, exp] = Frexp(1)
|
|
12
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
13
|
+
expect(exp).toBe(1) // 1 = 0.5 * 2^1
|
|
14
|
+
;[frac, exp] = Frexp(2)
|
|
15
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
16
|
+
expect(exp).toBe(2) // 2 = 0.5 * 2^2
|
|
17
|
+
;[frac, exp] = Frexp(4)
|
|
18
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
19
|
+
expect(exp).toBe(3) // 4 = 0.5 * 2^3
|
|
20
|
+
})
|
|
24
21
|
|
|
25
22
|
it('should handle fractional numbers', () => {
|
|
26
|
-
let [frac, exp] = Frexp(0.5)
|
|
27
|
-
expect(frac).toBeCloseTo(0.5, 10)
|
|
28
|
-
expect(exp).toBe(0)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
expect(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
expect(exp).toBe(-2); // 0.125 = 0.5 * 2^-2
|
|
37
|
-
});
|
|
23
|
+
let [frac, exp] = Frexp(0.5)
|
|
24
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
25
|
+
expect(exp).toBe(0) // 0.5 = 0.5 * 2^0
|
|
26
|
+
;[frac, exp] = Frexp(0.25)
|
|
27
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
28
|
+
expect(exp).toBe(-1) // 0.25 = 0.5 * 2^-1
|
|
29
|
+
;[frac, exp] = Frexp(0.125)
|
|
30
|
+
expect(frac).toBeCloseTo(0.5, 10)
|
|
31
|
+
expect(exp).toBe(-2) // 0.125 = 0.5 * 2^-2
|
|
32
|
+
})
|
|
38
33
|
|
|
39
34
|
it('should handle negative numbers', () => {
|
|
40
|
-
let [frac, exp] = Frexp(-8)
|
|
41
|
-
expect(frac).toBeCloseTo(-0.5, 10)
|
|
42
|
-
expect(exp).toBe(4)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
expect(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
expect(exp).toBe(0); // -0.5 = -0.5 * 2^0
|
|
51
|
-
});
|
|
35
|
+
let [frac, exp] = Frexp(-8)
|
|
36
|
+
expect(frac).toBeCloseTo(-0.5, 10)
|
|
37
|
+
expect(exp).toBe(4) // -8 = -0.5 * 2^4
|
|
38
|
+
;[frac, exp] = Frexp(-1)
|
|
39
|
+
expect(frac).toBeCloseTo(-0.5, 10)
|
|
40
|
+
expect(exp).toBe(1) // -1 = -0.5 * 2^1
|
|
41
|
+
;[frac, exp] = Frexp(-0.5)
|
|
42
|
+
expect(frac).toBeCloseTo(-0.5, 10)
|
|
43
|
+
expect(exp).toBe(0) // -0.5 = -0.5 * 2^0
|
|
44
|
+
})
|
|
52
45
|
|
|
53
46
|
it('should handle zero values', () => {
|
|
54
|
-
let [frac, exp] = Frexp(0)
|
|
55
|
-
expect(frac).toBe(0)
|
|
56
|
-
expect(exp).toBe(0)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
expect(
|
|
60
|
-
expect(
|
|
61
|
-
|
|
62
|
-
});
|
|
47
|
+
let [frac, exp] = Frexp(0)
|
|
48
|
+
expect(frac).toBe(0)
|
|
49
|
+
expect(exp).toBe(0)
|
|
50
|
+
;[frac, exp] = Frexp(-0)
|
|
51
|
+
expect(frac).toBe(-0)
|
|
52
|
+
expect(exp).toBe(0)
|
|
53
|
+
expect(Object.is(frac, -0)).toBe(true) // Preserve sign of zero
|
|
54
|
+
})
|
|
63
55
|
|
|
64
56
|
it('should handle infinity cases', () => {
|
|
65
|
-
let [frac, exp] = Frexp(Inf(1))
|
|
66
|
-
expect(frac).toBe(Inf(1))
|
|
67
|
-
expect(exp).toBe(0)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
expect(
|
|
71
|
-
|
|
72
|
-
});
|
|
57
|
+
let [frac, exp] = Frexp(Inf(1))
|
|
58
|
+
expect(frac).toBe(Inf(1))
|
|
59
|
+
expect(exp).toBe(0)
|
|
60
|
+
;[frac, exp] = Frexp(Inf(-1))
|
|
61
|
+
expect(frac).toBe(Inf(-1))
|
|
62
|
+
expect(exp).toBe(0)
|
|
63
|
+
})
|
|
73
64
|
|
|
74
65
|
it('should handle NaN cases', () => {
|
|
75
|
-
let [frac, _exp] = Frexp(GoNaN())
|
|
76
|
-
expect(IsNaN(frac)).toBe(true)
|
|
77
|
-
expect(_exp).toBe(0)
|
|
78
|
-
})
|
|
66
|
+
let [frac, _exp] = Frexp(GoNaN())
|
|
67
|
+
expect(IsNaN(frac)).toBe(true)
|
|
68
|
+
expect(_exp).toBe(0)
|
|
69
|
+
})
|
|
79
70
|
|
|
80
71
|
it('should satisfy the fundamental property f = frac * 2^exp', () => {
|
|
81
|
-
const testValues = [
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
72
|
+
const testValues = [
|
|
73
|
+
1, 2, 3, 4, 5, 8, 16, 0.5, 0.25, 0.125, 1.5, 3.14159, 100, 1000,
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
testValues.forEach((value) => {
|
|
77
|
+
const [frac, exp] = Frexp(value)
|
|
78
|
+
const reconstructed = frac * Math.pow(2, exp)
|
|
79
|
+
expect(reconstructed).toBeCloseTo(value, 10)
|
|
80
|
+
})
|
|
81
|
+
|
|
89
82
|
// Test negative values
|
|
90
|
-
testValues.forEach(value => {
|
|
91
|
-
const [frac, exp] = Frexp(-value)
|
|
92
|
-
const reconstructed = frac * Math.pow(2, exp)
|
|
93
|
-
expect(reconstructed).toBeCloseTo(-value, 10)
|
|
94
|
-
})
|
|
95
|
-
})
|
|
83
|
+
testValues.forEach((value) => {
|
|
84
|
+
const [frac, exp] = Frexp(-value)
|
|
85
|
+
const reconstructed = frac * Math.pow(2, exp)
|
|
86
|
+
expect(reconstructed).toBeCloseTo(-value, 10)
|
|
87
|
+
})
|
|
88
|
+
})
|
|
96
89
|
|
|
97
90
|
it('should ensure fraction is in range [0.5, 1) for positive numbers', () => {
|
|
98
|
-
const testValues = [
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
91
|
+
const testValues = [
|
|
92
|
+
1, 2, 3, 4, 5, 8, 16, 0.5, 0.25, 0.125, 1.5, 3.14159, 100, 1000,
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
testValues.forEach((value) => {
|
|
96
|
+
const [frac, _exp] = Frexp(value)
|
|
102
97
|
if (value !== 0) {
|
|
103
|
-
expect(Math.abs(frac)).toBeGreaterThanOrEqual(0.5)
|
|
104
|
-
expect(Math.abs(frac)).toBeLessThan(1)
|
|
98
|
+
expect(Math.abs(frac)).toBeGreaterThanOrEqual(0.5)
|
|
99
|
+
expect(Math.abs(frac)).toBeLessThan(1)
|
|
105
100
|
}
|
|
106
|
-
})
|
|
107
|
-
})
|
|
101
|
+
})
|
|
102
|
+
})
|
|
108
103
|
|
|
109
104
|
it('should handle very large numbers', () => {
|
|
110
|
-
const large = 1e100
|
|
111
|
-
const [frac, exp] = Frexp(large)
|
|
112
|
-
expect(Math.abs(frac)).toBeGreaterThanOrEqual(0.5)
|
|
113
|
-
expect(Math.abs(frac)).toBeLessThan(1)
|
|
114
|
-
expect(frac * Math.pow(2, exp)).toBeCloseTo(large, 5)
|
|
115
|
-
})
|
|
105
|
+
const large = 1e100
|
|
106
|
+
const [frac, exp] = Frexp(large)
|
|
107
|
+
expect(Math.abs(frac)).toBeGreaterThanOrEqual(0.5)
|
|
108
|
+
expect(Math.abs(frac)).toBeLessThan(1)
|
|
109
|
+
expect(frac * Math.pow(2, exp)).toBeCloseTo(large, 5)
|
|
110
|
+
})
|
|
116
111
|
|
|
117
112
|
it('should handle very small numbers', () => {
|
|
118
|
-
const small = 1e-100
|
|
119
|
-
const [frac, exp] = Frexp(small)
|
|
120
|
-
expect(Math.abs(frac)).toBeGreaterThanOrEqual(0.5)
|
|
121
|
-
expect(Math.abs(frac)).toBeLessThan(1)
|
|
122
|
-
expect(frac * Math.pow(2, exp)).toBeCloseTo(small, 110)
|
|
123
|
-
})
|
|
124
|
-
})
|
|
113
|
+
const small = 1e-100
|
|
114
|
+
const [frac, exp] = Frexp(small)
|
|
115
|
+
expect(Math.abs(frac)).toBeGreaterThanOrEqual(0.5)
|
|
116
|
+
expect(Math.abs(frac)).toBeLessThan(1)
|
|
117
|
+
expect(frac * Math.pow(2, exp)).toBeCloseTo(small, 110)
|
|
118
|
+
})
|
|
119
|
+
})
|
|
125
120
|
|
|
126
121
|
describe('frexp (lowercase)', () => {
|
|
127
122
|
it('should work identically to Frexp', () => {
|
|
128
|
-
const testValues = [0, 1, 2, 4, 8, 0.5, 0.25, -1, -2, 3.14159]
|
|
129
|
-
|
|
130
|
-
testValues.forEach(value => {
|
|
131
|
-
const [frac1, exp1] = Frexp(value)
|
|
132
|
-
const [frac2, exp2] = frexp(value)
|
|
133
|
-
expect(frac1).toBe(frac2)
|
|
134
|
-
expect(exp1).toBe(exp2)
|
|
135
|
-
})
|
|
136
|
-
|
|
123
|
+
const testValues = [0, 1, 2, 4, 8, 0.5, 0.25, -1, -2, 3.14159]
|
|
124
|
+
|
|
125
|
+
testValues.forEach((value) => {
|
|
126
|
+
const [frac1, exp1] = Frexp(value)
|
|
127
|
+
const [frac2, exp2] = frexp(value)
|
|
128
|
+
expect(frac1).toBe(frac2)
|
|
129
|
+
expect(exp1).toBe(exp2)
|
|
130
|
+
})
|
|
131
|
+
|
|
137
132
|
// Test special cases
|
|
138
|
-
expect(frexp(Inf(1))).toEqual(Frexp(Inf(1)))
|
|
139
|
-
expect(frexp(Inf(-1))).toEqual(Frexp(Inf(-1)))
|
|
140
|
-
|
|
141
|
-
const [fracNaN1, expNaN1] = frexp(GoNaN())
|
|
142
|
-
const [fracNaN2, expNaN2] = Frexp(GoNaN())
|
|
143
|
-
expect(IsNaN(fracNaN1)).toBe(IsNaN(fracNaN2))
|
|
144
|
-
expect(expNaN1).toBe(expNaN2)
|
|
145
|
-
})
|
|
146
|
-
})
|
|
133
|
+
expect(frexp(Inf(1))).toEqual(Frexp(Inf(1)))
|
|
134
|
+
expect(frexp(Inf(-1))).toEqual(Frexp(Inf(-1)))
|
|
135
|
+
|
|
136
|
+
const [fracNaN1, expNaN1] = frexp(GoNaN())
|
|
137
|
+
const [fracNaN2, expNaN2] = Frexp(GoNaN())
|
|
138
|
+
expect(IsNaN(fracNaN1)).toBe(IsNaN(fracNaN2))
|
|
139
|
+
expect(expNaN1).toBe(expNaN2)
|
|
140
|
+
})
|
|
141
|
+
})
|
package/gs/math/gamma.gs.test.ts
CHANGED