gofront 1.8.0 → 1.9.1
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/README.md +3 -3
- package/package.json +6 -5
- package/src/backend/js/expressions.js +1157 -408
- package/src/backend/js/index.js +327 -153
- package/src/backend/js/natives.js +383 -0
- package/src/backend/js/runtime.js +559 -2552
- package/src/backend/js/statements.js +670 -158
- package/src/backend/js/stdlib/index.js +45 -93
- package/src/backend/js/templ.js +32 -45
- package/src/backend/js/type-info.js +298 -19
- package/src/backend/shared/fixed-float.js +20 -0
- package/src/backend/shared/fmt-types.js +91 -170
- package/src/backend/shared/host-unicode.js +36 -0
- package/src/backend/wasm/boundary.js +490 -965
- package/src/backend/wasm/emit-builtins.js +884 -256
- package/src/backend/wasm/emit-exprs.js +185 -77
- package/src/backend/wasm/emit-maps.js +17 -367
- package/src/backend/wasm/emit-shared.js +4 -1
- package/src/backend/wasm/emit-stmts.js +524 -240
- package/src/backend/wasm/emit.js +176 -38
- package/src/backend/wasm/globals.js +48 -8
- package/src/backend/wasm/glue.js +2 -4
- package/src/backend/wasm/index.js +44 -530
- package/src/backend/wasm/method-expr.js +12 -1
- package/src/backend/wasm/module-emitter.js +299 -770
- package/src/backend/wasm/monomorph.js +139 -8
- package/src/backend/wasm/natives.js +600 -0
- package/src/backend/wasm/prescan.js +5 -153
- package/src/backend/wasm/prune-funcs.js +89 -0
- package/src/backend/wasm/stdlib/index.js +2 -32
- package/src/backend/wasm/types.js +97 -20
- package/src/backend/wasm/variadic.js +9 -4
- package/src/cli/cli-core.js +5 -1
- package/src/cli/test-runner.js +115 -342
- package/src/compiler.js +113 -130
- package/src/lexer/lexer.js +106 -11
- package/src/lexer/templ-lexer.js +61 -18
- package/src/lexer/tokens.js +1 -0
- package/src/link/stdlib.js +355 -132
- package/src/link/type-names.js +204 -0
- package/src/link/wasm.js +30 -6
- package/src/lower/bounds.js +153 -0
- package/src/lower/captures.js +92 -33
- package/src/lower/embedding.js +62 -5
- package/src/lower/errors-as.js +196 -0
- package/src/lower/fmt-formatters.js +929 -0
- package/src/lower/functions.js +225 -7
- package/src/lower/gen-types.js +293 -0
- package/src/lower/index.js +14 -2
- package/src/lower/json-codecs.js +334 -245
- package/src/lower/ownership.js +25 -7
- package/src/lower/reachability.js +69 -51
- package/src/lower/walk.js +12 -0
- package/src/parser/declarations.js +30 -5
- package/src/parser/expressions.js +111 -57
- package/src/parser/statements.js +108 -0
- package/src/parser/templ.js +44 -5
- package/src/parser/types.js +12 -0
- package/src/resolver.js +1 -2
- package/src/typechecker/assignability.js +214 -19
- package/src/typechecker/const-fold.js +70 -27
- package/src/typechecker/constants.js +156 -8
- package/src/typechecker/expressions.js +490 -108
- package/src/typechecker/index.js +346 -42
- package/src/typechecker/init-order.js +136 -40
- package/src/typechecker/operand-text.js +41 -0
- package/src/typechecker/resolve.js +490 -65
- package/src/typechecker/statements.js +288 -27
- package/src/typechecker/stdlib/excluded.js +9 -5
- package/src/typechecker/stdlib/index.js +25 -9
- package/src/typechecker/termination.js +10 -1
- package/src/typechecker/types.js +287 -575
- package/stdlib/bytes/buffer.go +479 -0
- package/stdlib/bytes/bytes.go +1010 -0
- package/stdlib/bytes/reader.go +161 -0
- package/stdlib/context/context.go +115 -0
- package/stdlib/crypto/rand/rand.go +34 -0
- package/stdlib/crypto/sha256/sha256.go +249 -0
- package/stdlib/encoding/base64/base64.go +331 -0
- package/stdlib/encoding/binary/binary.go +332 -0
- package/stdlib/encoding/hex/hex.go +140 -0
- package/stdlib/encoding/json/json.go +62 -0
- package/stdlib/errors/errors.go +174 -0
- package/stdlib/fmt/errors.go +110 -0
- package/stdlib/fmt/format.go +732 -0
- package/stdlib/fmt/print.go +1232 -0
- package/stdlib/gom/gom.go +293 -0
- package/stdlib/html/html.go +251 -0
- package/stdlib/internal/fmtrt/fmtrt.go +163 -0
- package/stdlib/internal/jsonrt/dec.go +171 -38
- package/stdlib/internal/jsonrt/enc.go +186 -36
- package/stdlib/internal/jsonrt/scanner.go +17 -8
- package/stdlib/io/io.go +157 -1
- package/stdlib/maps/maps.go +131 -0
- package/stdlib/math/bits/bits.go +507 -0
- package/stdlib/math/extra.go +16 -14
- package/stdlib/math/math.go +439 -0
- package/stdlib/math/rand/rand.go +297 -0
- package/stdlib/os/os.go +93 -0
- package/stdlib/path/filepath/filepath.go +47 -0
- package/stdlib/path/path.go +394 -0
- package/stdlib/regexp/regexp.go +231 -0
- package/stdlib/slices/slices.go +526 -0
- package/stdlib/slices/sort.go +209 -0
- package/stdlib/slices/zsort_cmp.go +480 -0
- package/stdlib/slices/zsort_ordered.go +482 -0
- package/stdlib/sort/sort.go +391 -452
- package/stdlib/sort/zsort_func.go +480 -0
- package/stdlib/sort/zsort_iface.go +480 -0
- package/stdlib/strconv/float.go +1699 -0
- package/stdlib/strconv/isprint.go +752 -0
- package/stdlib/strconv/quote.go +235 -50
- package/stdlib/strconv/strconv.go +616 -0
- package/stdlib/strings/builder.go +95 -0
- package/stdlib/strings/reader.go +163 -0
- package/stdlib/strings/replacer.go +102 -0
- package/stdlib/strings/strings.go +807 -0
- package/stdlib/sync/sync.go +268 -0
- package/stdlib/testing/async_js.go +61 -0
- package/stdlib/testing/benchmark.go +297 -0
- package/stdlib/testing/testing.go +523 -0
- package/stdlib/time/duration.go +233 -0
- package/stdlib/time/format.go +745 -0
- package/stdlib/time/parse.go +790 -0
- package/stdlib/time/sleep_js.go +63 -0
- package/stdlib/time/time.go +834 -0
- package/stdlib/unicode/unicode.go +141 -3
- package/stdlib/unicode/utf8/utf8.go +464 -0
- package/src/backend/js/fmt-runtime.js +0 -573
- package/src/backend/js/stdlib/base64.js +0 -12
- package/src/backend/js/stdlib/binary.js +0 -102
- package/src/backend/js/stdlib/bits.js +0 -119
- package/src/backend/js/stdlib/builder.js +0 -98
- package/src/backend/js/stdlib/bytes.js +0 -368
- package/src/backend/js/stdlib/errors.js +0 -45
- package/src/backend/js/stdlib/fmt.js +0 -517
- package/src/backend/js/stdlib/gom.js +0 -155
- package/src/backend/js/stdlib/hex.js +0 -17
- package/src/backend/js/stdlib/html.js +0 -20
- package/src/backend/js/stdlib/io.js +0 -137
- package/src/backend/js/stdlib/json.js +0 -1167
- package/src/backend/js/stdlib/maps.js +0 -37
- package/src/backend/js/stdlib/math.js +0 -85
- package/src/backend/js/stdlib/os.js +0 -13
- package/src/backend/js/stdlib/path.js +0 -48
- package/src/backend/js/stdlib/rand.js +0 -32
- package/src/backend/js/stdlib/regexp.js +0 -54
- package/src/backend/js/stdlib/sha256.js +0 -12
- package/src/backend/js/stdlib/shared.js +0 -17
- package/src/backend/js/stdlib/simd.js +0 -34
- package/src/backend/js/stdlib/slices.js +0 -107
- package/src/backend/js/stdlib/sort.js +0 -30
- package/src/backend/js/stdlib/strconv.js +0 -79
- package/src/backend/js/stdlib/strings.js +0 -301
- package/src/backend/js/stdlib/sync.js +0 -13
- package/src/backend/js/stdlib/testing.js +0 -41
- package/src/backend/js/stdlib/time.js +0 -152
- package/src/backend/js/stdlib/unicode.js +0 -25
- package/src/backend/js/stdlib/utf8.js +0 -26
- package/src/backend/wasm/stdlib/bytes.js +0 -6716
- package/src/backend/wasm/stdlib/core.js +0 -10278
- package/src/backend/wasm/stdlib/io.js +0 -3578
- package/src/backend/wasm/stdlib/packages.js +0 -2402
- package/src/backend/wasm/stdlib/pure.js +0 -720
- package/src/backend/wasm/stdlib/time.js +0 -2229
- package/src/typechecker/stdlib/core.js +0 -1079
- package/src/typechecker/stdlib/extended.js +0 -1210
- package/stdlib/bytes/iter.go +0 -192
- package/stdlib/bytes/search.go +0 -240
- package/stdlib/bytes/split.go +0 -218
- package/stdlib/errors/overlay.go +0 -12
- package/stdlib/maps/iter.go +0 -65
- package/stdlib/slices/extra.go +0 -73
- package/stdlib/slices/iter.go +0 -113
- package/stdlib/strings/extra.go +0 -35
- package/stdlib/strings/iter.go +0 -122
- package/stdlib/sync/extra.go +0 -105
- package/stdlib/unicode/utf8/bytes.go +0 -239
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
// Package math: constants, IEEE-754 bit access and the elementary functions.
|
|
2
|
+
//
|
|
3
|
+
// The bit-level functions are plain Go over Float64bits; the transcendental
|
|
4
|
+
// ones call the host's Math.* through intrinsics. Functions marked
|
|
5
|
+
// //gofront:native keep their Go body as the specification and compile to a
|
|
6
|
+
// single host expression or instruction when natives are enabled.
|
|
7
|
+
package math
|
|
8
|
+
|
|
9
|
+
// Mathematical constants.
|
|
10
|
+
const (
|
|
11
|
+
E = 2.71828182845904523536028747135266249775724709369995957496696763
|
|
12
|
+
Pi = 3.14159265358979323846264338327950288419716939937510582097494459
|
|
13
|
+
Phi = 1.61803398874989484820458683436563811772030917980576286213544862
|
|
14
|
+
Sqrt2 = 1.41421356237309504880168872420969807856967187537694807317667974
|
|
15
|
+
SqrtE = 1.64872127070012814684865078781416357165377610071014801157507931
|
|
16
|
+
SqrtPi = 1.77245385090551602729816748334114518279754945612238712821380779
|
|
17
|
+
SqrtPhi = 1.27201964951406896425242246173749149171560804184009624861664038
|
|
18
|
+
Ln2 = 0.693147180559945309417232121458176568075500134360255254120680009
|
|
19
|
+
Log2E = 1.44269504088896340735992468100189213742664595415298593413544940
|
|
20
|
+
Ln10 = 2.30258509299404568401799145468436420760110148862877297603332790
|
|
21
|
+
Log10E = 0.43429448190325182765112891891660508229439700580366656611445378
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
// Floating-point limits.
|
|
25
|
+
const (
|
|
26
|
+
MaxFloat32 = 3.40282346638528859811704183484516925440e+38
|
|
27
|
+
SmallestNonzeroFloat32 = 1.401298464324817070923729583289916131280e-45
|
|
28
|
+
MaxFloat64 = 1.79769313486231570814527423731704356798070e+308
|
|
29
|
+
SmallestNonzeroFloat64 = 4.9406564584124654417656879286822137236505980e-324
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
// Integer limits. MaxInt, MinInt and MaxUint are typed: `int` is 64 bits.
|
|
33
|
+
const (
|
|
34
|
+
MaxInt int = 1<<63 - 1
|
|
35
|
+
MinInt int = -1 << 63
|
|
36
|
+
MaxInt8 = 1<<7 - 1
|
|
37
|
+
MinInt8 = -1 << 7
|
|
38
|
+
MaxInt16 = 1<<15 - 1
|
|
39
|
+
MinInt16 = -1 << 15
|
|
40
|
+
MaxInt32 = 1<<31 - 1
|
|
41
|
+
MinInt32 = -1 << 31
|
|
42
|
+
MaxInt64 = 1<<63 - 1
|
|
43
|
+
MinInt64 = -1 << 63
|
|
44
|
+
MaxUint uint = 1<<64 - 1
|
|
45
|
+
MaxUint8 = 1<<8 - 1
|
|
46
|
+
MaxUint16 = 1<<16 - 1
|
|
47
|
+
MaxUint32 = 1<<32 - 1
|
|
48
|
+
MaxUint64 = 1<<64 - 1
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
const (
|
|
52
|
+
uvnan uint64 = 0x7FF8000000000001
|
|
53
|
+
uvneginf uint64 = 0xFFF0000000000000
|
|
54
|
+
uvone uint64 = 0x3FF0000000000000
|
|
55
|
+
halfShift uint64 = 1 << (shift - 1)
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
// ── IEEE-754 bit access ───────────────────────────────────────
|
|
59
|
+
|
|
60
|
+
// Float64bits returns the IEEE 754 binary representation of f.
|
|
61
|
+
//
|
|
62
|
+
//gofront:intrinsic math_float64bits
|
|
63
|
+
func Float64bits(f float64) uint64
|
|
64
|
+
|
|
65
|
+
// Float64frombits returns the float64 with binary representation b.
|
|
66
|
+
//
|
|
67
|
+
//gofront:intrinsic math_float64frombits
|
|
68
|
+
func Float64frombits(b uint64) float64
|
|
69
|
+
|
|
70
|
+
// Float32bits returns the IEEE 754 binary representation of f.
|
|
71
|
+
//
|
|
72
|
+
//gofront:intrinsic math_float32bits
|
|
73
|
+
func Float32bits(f float32) uint32
|
|
74
|
+
|
|
75
|
+
// Float32frombits returns the float32 with binary representation b.
|
|
76
|
+
//
|
|
77
|
+
//gofront:intrinsic math_float32frombits
|
|
78
|
+
func Float32frombits(b uint32) float32
|
|
79
|
+
|
|
80
|
+
// ── classification and sign ───────────────────────────────────
|
|
81
|
+
|
|
82
|
+
// IsNaN reports whether f is an IEEE 754 "not-a-number" value.
|
|
83
|
+
//
|
|
84
|
+
//gofront:native math.IsNaN
|
|
85
|
+
func IsNaN(f float64) (is bool) {
|
|
86
|
+
return f != f
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// IsInf reports whether f is an infinity, according to sign.
|
|
90
|
+
//
|
|
91
|
+
//gofront:native math.IsInf
|
|
92
|
+
func IsInf(f float64, sign int) bool {
|
|
93
|
+
return sign >= 0 && f > MaxFloat64 || sign <= 0 && f < -MaxFloat64
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Inf returns positive infinity if sign >= 0, negative infinity if sign < 0.
|
|
97
|
+
//
|
|
98
|
+
//gofront:native math.Inf
|
|
99
|
+
func Inf(sign int) float64 {
|
|
100
|
+
var v uint64
|
|
101
|
+
if sign >= 0 {
|
|
102
|
+
v = 0x7FF0000000000000
|
|
103
|
+
} else {
|
|
104
|
+
v = uvneginf
|
|
105
|
+
}
|
|
106
|
+
return Float64frombits(v)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// NaN returns an IEEE 754 "not-a-number" value.
|
|
110
|
+
//
|
|
111
|
+
//gofront:native math.NaN
|
|
112
|
+
func NaN() float64 { return Float64frombits(uvnan) }
|
|
113
|
+
|
|
114
|
+
// Signbit reports whether x is negative or negative zero.
|
|
115
|
+
//
|
|
116
|
+
//gofront:native math.Signbit
|
|
117
|
+
func Signbit(x float64) bool {
|
|
118
|
+
return Float64bits(x)&(1<<63) != 0
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Copysign returns a value with the magnitude of f and the sign of sign.
|
|
122
|
+
//
|
|
123
|
+
//gofront:native math.Copysign
|
|
124
|
+
func Copysign(f, sign float64) float64 {
|
|
125
|
+
const signBit = 1 << 63
|
|
126
|
+
return Float64frombits(Float64bits(f)&^signBit | Float64bits(sign)&signBit)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Abs returns the absolute value of x.
|
|
130
|
+
//
|
|
131
|
+
//gofront:native math.Abs
|
|
132
|
+
func Abs(x float64) float64 {
|
|
133
|
+
return Float64frombits(Float64bits(x) &^ (1 << 63))
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Max returns the larger of x or y.
|
|
137
|
+
//
|
|
138
|
+
//gofront:native math.Max
|
|
139
|
+
func Max(x, y float64) float64 {
|
|
140
|
+
switch {
|
|
141
|
+
case IsInf(x, 1) || IsInf(y, 1):
|
|
142
|
+
return Inf(1)
|
|
143
|
+
case IsNaN(x) || IsNaN(y):
|
|
144
|
+
return NaN()
|
|
145
|
+
case x == 0 && x == y:
|
|
146
|
+
if Signbit(x) {
|
|
147
|
+
return y
|
|
148
|
+
}
|
|
149
|
+
return x
|
|
150
|
+
}
|
|
151
|
+
if x > y {
|
|
152
|
+
return x
|
|
153
|
+
}
|
|
154
|
+
return y
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Min returns the smaller of x or y.
|
|
158
|
+
//
|
|
159
|
+
//gofront:native math.Min
|
|
160
|
+
func Min(x, y float64) float64 {
|
|
161
|
+
switch {
|
|
162
|
+
case IsInf(x, -1) || IsInf(y, -1):
|
|
163
|
+
return Inf(-1)
|
|
164
|
+
case IsNaN(x) || IsNaN(y):
|
|
165
|
+
return NaN()
|
|
166
|
+
case x == 0 && x == y:
|
|
167
|
+
if Signbit(x) {
|
|
168
|
+
return x
|
|
169
|
+
}
|
|
170
|
+
return y
|
|
171
|
+
}
|
|
172
|
+
if x < y {
|
|
173
|
+
return x
|
|
174
|
+
}
|
|
175
|
+
return y
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Dim returns the maximum of x-y or 0.
|
|
179
|
+
func Dim(x, y float64) float64 {
|
|
180
|
+
v := x - y
|
|
181
|
+
if v <= 0 {
|
|
182
|
+
return 0
|
|
183
|
+
}
|
|
184
|
+
return v
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// ── rounding ──────────────────────────────────────────────────
|
|
188
|
+
|
|
189
|
+
// Modf returns integer and fractional floating-point numbers that sum to f.
|
|
190
|
+
func Modf(f float64) (int float64, frac float64) {
|
|
191
|
+
if f < 1 {
|
|
192
|
+
switch {
|
|
193
|
+
case f < 0:
|
|
194
|
+
int, frac = Modf(-f)
|
|
195
|
+
return -int, -frac
|
|
196
|
+
case f == 0:
|
|
197
|
+
return f, f
|
|
198
|
+
}
|
|
199
|
+
return 0, f
|
|
200
|
+
}
|
|
201
|
+
x := Float64bits(f)
|
|
202
|
+
e := uint(x>>shift)&mask - bias
|
|
203
|
+
if e < 64-12 {
|
|
204
|
+
x &^= 1<<(64-12-e) - 1
|
|
205
|
+
}
|
|
206
|
+
int = Float64frombits(x)
|
|
207
|
+
frac = f - int
|
|
208
|
+
return
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Trunc returns the integer value of x.
|
|
212
|
+
//
|
|
213
|
+
//gofront:native math.Trunc
|
|
214
|
+
func Trunc(x float64) float64 {
|
|
215
|
+
if x == 0 || IsNaN(x) || IsInf(x, 0) {
|
|
216
|
+
return x
|
|
217
|
+
}
|
|
218
|
+
d, _ := Modf(x)
|
|
219
|
+
return d
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Floor returns the greatest integer value less than or equal to x.
|
|
223
|
+
//
|
|
224
|
+
//gofront:native math.Floor
|
|
225
|
+
func Floor(x float64) float64 {
|
|
226
|
+
if x == 0 || IsNaN(x) || IsInf(x, 0) {
|
|
227
|
+
return x
|
|
228
|
+
}
|
|
229
|
+
if x < 0 {
|
|
230
|
+
d, fract := Modf(-x)
|
|
231
|
+
if fract != 0.0 {
|
|
232
|
+
d = d + 1
|
|
233
|
+
}
|
|
234
|
+
return -d
|
|
235
|
+
}
|
|
236
|
+
d, _ := Modf(x)
|
|
237
|
+
return d
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Ceil returns the least integer value greater than or equal to x.
|
|
241
|
+
//
|
|
242
|
+
//gofront:native math.Ceil
|
|
243
|
+
func Ceil(x float64) float64 {
|
|
244
|
+
return -Floor(-x)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Round returns the nearest integer, rounding half away from zero.
|
|
248
|
+
//
|
|
249
|
+
//gofront:native math.Round
|
|
250
|
+
func Round(x float64) float64 {
|
|
251
|
+
bits := Float64bits(x)
|
|
252
|
+
e := uint(bits>>shift) & mask
|
|
253
|
+
if e < bias {
|
|
254
|
+
bits &= signMask
|
|
255
|
+
if e == bias-1 {
|
|
256
|
+
bits |= uvone
|
|
257
|
+
}
|
|
258
|
+
} else if e < bias+shift {
|
|
259
|
+
e -= bias
|
|
260
|
+
bits += halfShift >> e
|
|
261
|
+
bits &^= fracMask >> e
|
|
262
|
+
}
|
|
263
|
+
return Float64frombits(bits)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Remainder returns the IEEE 754 floating-point remainder of x/y.
|
|
267
|
+
func Remainder(x, y float64) float64 {
|
|
268
|
+
const (
|
|
269
|
+
Tiny = 4.45014771701440276618e-308
|
|
270
|
+
HalfMax = MaxFloat64 / 2
|
|
271
|
+
)
|
|
272
|
+
switch {
|
|
273
|
+
case IsNaN(x) || IsNaN(y) || IsInf(x, 0) || y == 0:
|
|
274
|
+
return NaN()
|
|
275
|
+
case IsInf(y, 0):
|
|
276
|
+
return x
|
|
277
|
+
}
|
|
278
|
+
sign := false
|
|
279
|
+
if x < 0 {
|
|
280
|
+
x = -x
|
|
281
|
+
sign = true
|
|
282
|
+
}
|
|
283
|
+
if y < 0 {
|
|
284
|
+
y = -y
|
|
285
|
+
}
|
|
286
|
+
if x == y {
|
|
287
|
+
if sign {
|
|
288
|
+
return Copysign(0, -1)
|
|
289
|
+
}
|
|
290
|
+
return 0
|
|
291
|
+
}
|
|
292
|
+
if y <= HalfMax {
|
|
293
|
+
x = Mod(x, y+y)
|
|
294
|
+
}
|
|
295
|
+
if y < Tiny {
|
|
296
|
+
if x+x > y {
|
|
297
|
+
x -= y
|
|
298
|
+
if x+x >= y {
|
|
299
|
+
x -= y
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
} else {
|
|
303
|
+
yHalf := 0.5 * y
|
|
304
|
+
if x > yHalf {
|
|
305
|
+
x -= y
|
|
306
|
+
if x >= yHalf {
|
|
307
|
+
x -= y
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if sign {
|
|
312
|
+
x = -x
|
|
313
|
+
}
|
|
314
|
+
return x
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// ── square root ───────────────────────────────────────────────
|
|
318
|
+
|
|
319
|
+
// Sqrt returns the square root of x.
|
|
320
|
+
//
|
|
321
|
+
//gofront:native math.Sqrt
|
|
322
|
+
func Sqrt(x float64) float64 {
|
|
323
|
+
switch {
|
|
324
|
+
case x == 0 || IsNaN(x) || IsInf(x, 1):
|
|
325
|
+
return x
|
|
326
|
+
case x < 0:
|
|
327
|
+
return NaN()
|
|
328
|
+
}
|
|
329
|
+
ix := Float64bits(x)
|
|
330
|
+
exp := int((ix >> shift) & mask)
|
|
331
|
+
if exp == 0 {
|
|
332
|
+
for ix&(1<<shift) == 0 {
|
|
333
|
+
ix <<= 1
|
|
334
|
+
exp--
|
|
335
|
+
}
|
|
336
|
+
exp++
|
|
337
|
+
}
|
|
338
|
+
exp -= bias
|
|
339
|
+
ix &^= mask << shift
|
|
340
|
+
ix |= 1 << shift
|
|
341
|
+
if exp&1 == 1 {
|
|
342
|
+
ix <<= 1
|
|
343
|
+
}
|
|
344
|
+
exp >>= 1
|
|
345
|
+
ix <<= 1
|
|
346
|
+
var q, s uint64
|
|
347
|
+
r := uint64(1 << (shift + 1))
|
|
348
|
+
for r != 0 {
|
|
349
|
+
t := s + r
|
|
350
|
+
if t <= ix {
|
|
351
|
+
s = t + r
|
|
352
|
+
ix -= t
|
|
353
|
+
q += r
|
|
354
|
+
}
|
|
355
|
+
ix <<= 1
|
|
356
|
+
r >>= 1
|
|
357
|
+
}
|
|
358
|
+
if ix != 0 {
|
|
359
|
+
q += q & 1
|
|
360
|
+
}
|
|
361
|
+
ix = q>>1 + uint64(exp-1+bias)<<shift
|
|
362
|
+
return Float64frombits(ix)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
// Exp2 returns 2**x.
|
|
366
|
+
func Exp2(x float64) float64 { return Pow(2, x) }
|
|
367
|
+
|
|
368
|
+
// ── host functions ────────────────────────────────────────────
|
|
369
|
+
//
|
|
370
|
+
// Each is the host's Math.* of the same name; Mod is JavaScript's `%`.
|
|
371
|
+
|
|
372
|
+
//gofront:intrinsic math_sin
|
|
373
|
+
func Sin(x float64) float64
|
|
374
|
+
|
|
375
|
+
//gofront:intrinsic math_cos
|
|
376
|
+
func Cos(x float64) float64
|
|
377
|
+
|
|
378
|
+
//gofront:intrinsic math_tan
|
|
379
|
+
func Tan(x float64) float64
|
|
380
|
+
|
|
381
|
+
//gofront:intrinsic math_asin
|
|
382
|
+
func Asin(x float64) float64
|
|
383
|
+
|
|
384
|
+
//gofront:intrinsic math_acos
|
|
385
|
+
func Acos(x float64) float64
|
|
386
|
+
|
|
387
|
+
//gofront:intrinsic math_atan
|
|
388
|
+
func Atan(x float64) float64
|
|
389
|
+
|
|
390
|
+
//gofront:intrinsic math_atan2
|
|
391
|
+
func Atan2(y, x float64) float64
|
|
392
|
+
|
|
393
|
+
//gofront:intrinsic math_sinh
|
|
394
|
+
func Sinh(x float64) float64
|
|
395
|
+
|
|
396
|
+
//gofront:intrinsic math_cosh
|
|
397
|
+
func Cosh(x float64) float64
|
|
398
|
+
|
|
399
|
+
//gofront:intrinsic math_tanh
|
|
400
|
+
func Tanh(x float64) float64
|
|
401
|
+
|
|
402
|
+
//gofront:intrinsic math_exp
|
|
403
|
+
func Exp(x float64) float64
|
|
404
|
+
|
|
405
|
+
//gofront:intrinsic math_expm1
|
|
406
|
+
func Expm1(x float64) float64
|
|
407
|
+
|
|
408
|
+
//gofront:intrinsic math_log
|
|
409
|
+
func Log(x float64) float64
|
|
410
|
+
|
|
411
|
+
//gofront:intrinsic math_log1p
|
|
412
|
+
func Log1p(x float64) float64
|
|
413
|
+
|
|
414
|
+
//gofront:intrinsic math_log2
|
|
415
|
+
func Log2(x float64) float64
|
|
416
|
+
|
|
417
|
+
//gofront:intrinsic math_log10
|
|
418
|
+
func Log10(x float64) float64
|
|
419
|
+
|
|
420
|
+
//gofront:intrinsic math_cbrt
|
|
421
|
+
func Cbrt(x float64) float64
|
|
422
|
+
|
|
423
|
+
//gofront:intrinsic math_pow
|
|
424
|
+
func hostPow(x, y float64) float64
|
|
425
|
+
|
|
426
|
+
// Pow returns x**y. JavaScript's Math.pow gives NaN for 1 and -1 to an
|
|
427
|
+
// infinite or NaN power where Go gives 1.
|
|
428
|
+
func Pow(x, y float64) float64 {
|
|
429
|
+
if x == 1 || x == -1 && IsInf(y, 0) {
|
|
430
|
+
return 1
|
|
431
|
+
}
|
|
432
|
+
return hostPow(x, y)
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
//gofront:intrinsic math_hypot
|
|
436
|
+
func Hypot(p, q float64) float64
|
|
437
|
+
|
|
438
|
+
//gofront:intrinsic math_mod
|
|
439
|
+
func Mod(x, y float64) float64
|