goscript 0.0.33 → 0.0.35

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.
Files changed (347) hide show
  1. package/compiler/analysis.go +30 -22
  2. package/compiler/analysis_test.go +14 -0
  3. package/compiler/assignment.go +45 -7
  4. package/compiler/builtin_test.go +2 -0
  5. package/compiler/compiler.go +15 -89
  6. package/compiler/compiler_test.go +0 -53
  7. package/compiler/composite-lit.go +60 -17
  8. package/compiler/decl.go +1 -1
  9. package/compiler/expr-call.go +347 -30
  10. package/compiler/expr-selector.go +28 -2
  11. package/compiler/expr.go +79 -38
  12. package/compiler/lit.go +112 -3
  13. package/compiler/primitive.go +6 -6
  14. package/compiler/protobuf.go +0 -5
  15. package/compiler/sanitize.go +101 -0
  16. package/compiler/spec-value.go +25 -18
  17. package/compiler/stmt-assign.go +128 -91
  18. package/compiler/stmt-for.go +78 -1
  19. package/compiler/stmt-range.go +333 -461
  20. package/compiler/stmt.go +46 -9
  21. package/compiler/type.go +14 -11
  22. package/dist/gs/builtin/builtin.d.ts +8 -0
  23. package/dist/gs/builtin/builtin.js +31 -0
  24. package/dist/gs/builtin/builtin.js.map +1 -1
  25. package/dist/gs/builtin/map.d.ts +4 -4
  26. package/dist/gs/builtin/map.js +12 -6
  27. package/dist/gs/builtin/map.js.map +1 -1
  28. package/dist/gs/builtin/slice.d.ts +14 -8
  29. package/dist/gs/builtin/slice.js +131 -31
  30. package/dist/gs/builtin/slice.js.map +1 -1
  31. package/dist/gs/github.com/pkg/errors/errors.d.ts +13 -0
  32. package/dist/gs/github.com/pkg/errors/errors.js +232 -0
  33. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -0
  34. package/dist/gs/github.com/pkg/errors/go113.d.ts +4 -0
  35. package/dist/gs/github.com/pkg/errors/go113.js +34 -0
  36. package/dist/gs/github.com/pkg/errors/go113.js.map +1 -0
  37. package/dist/gs/github.com/pkg/errors/index.d.ts +3 -0
  38. package/dist/gs/github.com/pkg/errors/index.js +4 -0
  39. package/dist/gs/github.com/pkg/errors/index.js.map +1 -0
  40. package/dist/gs/github.com/pkg/errors/stack.d.ts +32 -0
  41. package/dist/gs/github.com/pkg/errors/stack.js +111 -0
  42. package/dist/gs/github.com/pkg/errors/stack.js.map +1 -0
  43. package/dist/gs/maps/index.d.ts +2 -0
  44. package/dist/gs/maps/index.js +3 -0
  45. package/dist/gs/maps/index.js.map +1 -0
  46. package/dist/gs/maps/iter.d.ts +7 -0
  47. package/dist/gs/maps/iter.gs.d.ts +7 -0
  48. package/dist/gs/maps/iter.gs.js +65 -0
  49. package/dist/gs/maps/iter.gs.js.map +1 -0
  50. package/dist/gs/maps/iter.js +57 -0
  51. package/dist/gs/maps/iter.js.map +1 -0
  52. package/dist/gs/maps/maps.d.ts +7 -0
  53. package/dist/gs/maps/maps.gs.d.ts +7 -0
  54. package/dist/gs/maps/maps.gs.js +79 -0
  55. package/dist/gs/maps/maps.gs.js.map +1 -0
  56. package/dist/gs/maps/maps.js +67 -0
  57. package/dist/gs/maps/maps.js.map +1 -0
  58. package/dist/gs/math/abs.gs.d.ts +1 -0
  59. package/dist/gs/math/abs.gs.js +10 -0
  60. package/dist/gs/math/abs.gs.js.map +1 -0
  61. package/dist/gs/math/acosh.gs.d.ts +2 -0
  62. package/dist/gs/math/acosh.gs.js +14 -0
  63. package/dist/gs/math/acosh.gs.js.map +1 -0
  64. package/dist/gs/math/asin.gs.d.ts +4 -0
  65. package/dist/gs/math/asin.gs.js +24 -0
  66. package/dist/gs/math/asin.gs.js.map +1 -0
  67. package/dist/gs/math/asinh.gs.d.ts +2 -0
  68. package/dist/gs/math/asinh.gs.js +14 -0
  69. package/dist/gs/math/asinh.gs.js.map +1 -0
  70. package/dist/gs/math/atan.gs.d.ts +4 -0
  71. package/dist/gs/math/atan.gs.js +22 -0
  72. package/dist/gs/math/atan.gs.js.map +1 -0
  73. package/dist/gs/math/atan2.gs.d.ts +2 -0
  74. package/dist/gs/math/atan2.gs.js +30 -0
  75. package/dist/gs/math/atan2.gs.js.map +1 -0
  76. package/dist/gs/math/atanh.gs.d.ts +2 -0
  77. package/dist/gs/math/atanh.gs.js +16 -0
  78. package/dist/gs/math/atanh.gs.js.map +1 -0
  79. package/dist/gs/math/bits.gs.d.ts +5 -0
  80. package/dist/gs/math/bits.gs.js +46 -0
  81. package/dist/gs/math/bits.gs.js.map +1 -0
  82. package/dist/gs/math/cbrt.gs.d.ts +2 -0
  83. package/dist/gs/math/cbrt.gs.js +14 -0
  84. package/dist/gs/math/cbrt.gs.js.map +1 -0
  85. package/dist/gs/math/const.gs.d.ts +30 -0
  86. package/dist/gs/math/const.gs.js +61 -0
  87. package/dist/gs/math/const.gs.js.map +1 -0
  88. package/dist/gs/math/copysign.gs.d.ts +1 -0
  89. package/dist/gs/math/copysign.gs.js +20 -0
  90. package/dist/gs/math/copysign.gs.js.map +1 -0
  91. package/dist/gs/math/dim.gs.d.ts +5 -0
  92. package/dist/gs/math/dim.gs.js +69 -0
  93. package/dist/gs/math/dim.gs.js.map +1 -0
  94. package/dist/gs/math/erf.gs.d.ts +4 -0
  95. package/dist/gs/math/erf.gs.js +336 -0
  96. package/dist/gs/math/erf.gs.js.map +1 -0
  97. package/dist/gs/math/erfinv.gs.d.ts +2 -0
  98. package/dist/gs/math/erfinv.gs.js +118 -0
  99. package/dist/gs/math/erfinv.gs.js.map +1 -0
  100. package/dist/gs/math/exp.gs.d.ts +5 -0
  101. package/dist/gs/math/exp.gs.js +30 -0
  102. package/dist/gs/math/exp.gs.js.map +1 -0
  103. package/dist/gs/math/expm1.gs.d.ts +2 -0
  104. package/dist/gs/math/expm1.gs.js +17 -0
  105. package/dist/gs/math/expm1.gs.js.map +1 -0
  106. package/dist/gs/math/floor.gs.d.ts +8 -0
  107. package/dist/gs/math/floor.gs.js +75 -0
  108. package/dist/gs/math/floor.gs.js.map +1 -0
  109. package/dist/gs/math/fma.gs.d.ts +1 -0
  110. package/dist/gs/math/fma.gs.js +8 -0
  111. package/dist/gs/math/fma.gs.js.map +1 -0
  112. package/dist/gs/math/frexp.gs.d.ts +2 -0
  113. package/dist/gs/math/frexp.gs.js +28 -0
  114. package/dist/gs/math/frexp.gs.js.map +1 -0
  115. package/dist/gs/math/gamma.gs.d.ts +3 -0
  116. package/dist/gs/math/gamma.gs.js +149 -0
  117. package/dist/gs/math/gamma.gs.js.map +1 -0
  118. package/dist/gs/math/hypot.gs.d.ts +2 -0
  119. package/dist/gs/math/hypot.gs.js +16 -0
  120. package/dist/gs/math/hypot.gs.js.map +1 -0
  121. package/dist/gs/math/index.d.ts +44 -0
  122. package/dist/gs/math/index.js +45 -0
  123. package/dist/gs/math/index.js.map +1 -0
  124. package/dist/gs/math/j0.gs.d.ts +4 -0
  125. package/dist/gs/math/j0.gs.js +228 -0
  126. package/dist/gs/math/j0.gs.js.map +1 -0
  127. package/dist/gs/math/j1.gs.d.ts +4 -0
  128. package/dist/gs/math/j1.gs.js +211 -0
  129. package/dist/gs/math/j1.gs.js.map +1 -0
  130. package/dist/gs/math/jn.gs.d.ts +2 -0
  131. package/dist/gs/math/jn.gs.js +412 -0
  132. package/dist/gs/math/jn.gs.js.map +1 -0
  133. package/dist/gs/math/ldexp.gs.d.ts +2 -0
  134. package/dist/gs/math/ldexp.gs.js +20 -0
  135. package/dist/gs/math/ldexp.gs.js.map +1 -0
  136. package/dist/gs/math/lgamma.gs.d.ts +2 -0
  137. package/dist/gs/math/lgamma.gs.js +243 -0
  138. package/dist/gs/math/lgamma.gs.js.map +1 -0
  139. package/dist/gs/math/log.gs.d.ts +2 -0
  140. package/dist/gs/math/log.gs.js +16 -0
  141. package/dist/gs/math/log.gs.js.map +1 -0
  142. package/dist/gs/math/log10.gs.d.ts +4 -0
  143. package/dist/gs/math/log10.gs.js +17 -0
  144. package/dist/gs/math/log10.gs.js.map +1 -0
  145. package/dist/gs/math/log1p.gs.d.ts +2 -0
  146. package/dist/gs/math/log1p.gs.js +17 -0
  147. package/dist/gs/math/log1p.gs.js.map +1 -0
  148. package/dist/gs/math/logb.gs.d.ts +3 -0
  149. package/dist/gs/math/logb.gs.js +43 -0
  150. package/dist/gs/math/logb.gs.js.map +1 -0
  151. package/dist/gs/math/mod.gs.d.ts +2 -0
  152. package/dist/gs/math/mod.gs.js +26 -0
  153. package/dist/gs/math/mod.gs.js.map +1 -0
  154. package/dist/gs/math/modf.gs.d.ts +2 -0
  155. package/dist/gs/math/modf.gs.js +24 -0
  156. package/dist/gs/math/modf.gs.js.map +1 -0
  157. package/dist/gs/math/nextafter.gs.d.ts +2 -0
  158. package/dist/gs/math/nextafter.gs.js +66 -0
  159. package/dist/gs/math/nextafter.gs.js.map +1 -0
  160. package/dist/gs/math/pow.gs.d.ts +3 -0
  161. package/dist/gs/math/pow.gs.js +40 -0
  162. package/dist/gs/math/pow.gs.js.map +1 -0
  163. package/dist/gs/math/pow10.gs.d.ts +1 -0
  164. package/dist/gs/math/pow10.gs.js +14 -0
  165. package/dist/gs/math/pow10.gs.js.map +1 -0
  166. package/dist/gs/math/remainder.gs.d.ts +2 -0
  167. package/dist/gs/math/remainder.gs.js +25 -0
  168. package/dist/gs/math/remainder.gs.js.map +1 -0
  169. package/dist/gs/math/signbit.gs.d.ts +1 -0
  170. package/dist/gs/math/signbit.gs.js +5 -0
  171. package/dist/gs/math/signbit.gs.js.map +1 -0
  172. package/dist/gs/math/sin.gs.d.ts +4 -0
  173. package/dist/gs/math/sin.gs.js +29 -0
  174. package/dist/gs/math/sin.gs.js.map +1 -0
  175. package/dist/gs/math/sincos.gs.d.ts +1 -0
  176. package/dist/gs/math/sincos.gs.js +11 -0
  177. package/dist/gs/math/sincos.gs.js.map +1 -0
  178. package/dist/gs/math/sinh.gs.d.ts +4 -0
  179. package/dist/gs/math/sinh.gs.js +27 -0
  180. package/dist/gs/math/sinh.gs.js.map +1 -0
  181. package/dist/gs/math/sqrt.gs.d.ts +2 -0
  182. package/dist/gs/math/sqrt.gs.js +15 -0
  183. package/dist/gs/math/sqrt.gs.js.map +1 -0
  184. package/dist/gs/math/tan.gs.d.ts +2 -0
  185. package/dist/gs/math/tan.gs.js +17 -0
  186. package/dist/gs/math/tan.gs.js.map +1 -0
  187. package/dist/gs/math/tanh.gs.d.ts +2 -0
  188. package/dist/gs/math/tanh.gs.js +17 -0
  189. package/dist/gs/math/tanh.gs.js.map +1 -0
  190. package/dist/gs/math/trig_reduce.gs.d.ts +1 -0
  191. package/dist/gs/math/trig_reduce.gs.js +62 -0
  192. package/dist/gs/math/trig_reduce.gs.js.map +1 -0
  193. package/dist/gs/math/unsafe.gs.d.ts +4 -0
  194. package/dist/gs/math/unsafe.gs.js +47 -0
  195. package/dist/gs/math/unsafe.gs.js.map +1 -0
  196. package/dist/gs/slices/slices.d.ts +6 -0
  197. package/dist/gs/slices/slices.js +8 -0
  198. package/dist/gs/slices/slices.js.map +1 -1
  199. package/dist/gs/strconv/atob.gs.d.ts +4 -0
  200. package/dist/gs/strconv/atob.gs.js +42 -0
  201. package/dist/gs/strconv/atob.gs.js.map +1 -0
  202. package/dist/gs/strconv/atof.gs.d.ts +2 -0
  203. package/dist/gs/strconv/atof.gs.js +51 -0
  204. package/dist/gs/strconv/atof.gs.js.map +1 -0
  205. package/dist/gs/strconv/atoi.gs.d.ts +33 -0
  206. package/dist/gs/strconv/atoi.gs.js +200 -0
  207. package/dist/gs/strconv/atoi.gs.js.map +1 -0
  208. package/dist/gs/strconv/doc.gs.d.ts +1 -0
  209. package/dist/gs/strconv/doc.gs.js +2 -0
  210. package/dist/gs/strconv/doc.gs.js.map +1 -0
  211. package/dist/gs/strconv/ftoa.gs.d.ts +3 -0
  212. package/dist/gs/strconv/ftoa.gs.js +58 -0
  213. package/dist/gs/strconv/ftoa.gs.js.map +1 -0
  214. package/dist/gs/strconv/index.d.ts +6 -0
  215. package/dist/gs/strconv/index.js +7 -0
  216. package/dist/gs/strconv/index.js.map +1 -0
  217. package/dist/gs/strconv/itoa.gs.d.ts +6 -0
  218. package/dist/gs/strconv/itoa.gs.js +37 -0
  219. package/dist/gs/strconv/itoa.gs.js.map +1 -0
  220. package/dist/gs/strconv/quote.gs.d.ts +19 -0
  221. package/dist/gs/strconv/quote.gs.js +217 -0
  222. package/dist/gs/strconv/quote.gs.js.map +1 -0
  223. package/dist/gs/strings/index.d.ts +3 -0
  224. package/dist/gs/strings/index.js +4 -0
  225. package/dist/gs/strings/index.js.map +1 -1
  226. package/dist/gs/strings/replace.d.ts +0 -74
  227. package/dist/gs/strings/replace.js +6 -204
  228. package/dist/gs/strings/replace.js.map +1 -1
  229. package/dist/gs/strings/search.d.ts +0 -1
  230. package/dist/gs/strings/search.js +0 -21
  231. package/dist/gs/strings/search.js.map +1 -1
  232. package/gs/builtin/builtin.ts +40 -0
  233. package/gs/builtin/map.ts +12 -7
  234. package/gs/builtin/slice.ts +174 -34
  235. package/gs/github.com/pkg/errors/errors.ts +307 -0
  236. package/gs/github.com/pkg/errors/go113.ts +39 -0
  237. package/gs/github.com/pkg/errors/index.ts +3 -0
  238. package/gs/github.com/pkg/errors/stack.ts +127 -0
  239. package/gs/maps/index.ts +2 -0
  240. package/gs/maps/iter.ts +67 -0
  241. package/gs/maps/maps.ts +89 -0
  242. package/gs/math/TODO.md +156 -0
  243. package/gs/math/abs.gs.test.ts +29 -0
  244. package/gs/math/abs.gs.ts +13 -0
  245. package/gs/math/acosh.gs.test.ts +39 -0
  246. package/gs/math/acosh.gs.ts +21 -0
  247. package/gs/math/asin.gs.test.ts +66 -0
  248. package/gs/math/asin.gs.ts +27 -0
  249. package/gs/math/asinh.gs.test.ts +37 -0
  250. package/gs/math/asinh.gs.ts +21 -0
  251. package/gs/math/atan.gs.test.ts +49 -0
  252. package/gs/math/atan.gs.ts +27 -0
  253. package/gs/math/atan2.gs.test.ts +55 -0
  254. package/gs/math/atan2.gs.ts +37 -0
  255. package/gs/math/atanh.gs.test.ts +47 -0
  256. package/gs/math/atanh.gs.ts +21 -0
  257. package/gs/math/bits.gs.test.ts +88 -0
  258. package/gs/math/bits.gs.ts +61 -0
  259. package/gs/math/cbrt.gs.test.ts +57 -0
  260. package/gs/math/cbrt.gs.ts +20 -0
  261. package/gs/math/const.gs.test.ts +54 -0
  262. package/gs/math/const.gs.ts +93 -0
  263. package/gs/math/copysign.gs.test.ts +44 -0
  264. package/gs/math/copysign.gs.ts +27 -0
  265. package/gs/math/dim.gs.test.ts +102 -0
  266. package/gs/math/dim.gs.ts +84 -0
  267. package/gs/math/erf.gs.test.ts +92 -0
  268. package/gs/math/erf.gs.ts +409 -0
  269. package/gs/math/erfinv.gs.test.ts +104 -0
  270. package/gs/math/erfinv.gs.ts +169 -0
  271. package/gs/math/exp.gs.test.ts +82 -0
  272. package/gs/math/exp.gs.ts +39 -0
  273. package/gs/math/expm1.gs.test.ts +48 -0
  274. package/gs/math/expm1.gs.ts +23 -0
  275. package/gs/math/floor.gs.test.ts +146 -0
  276. package/gs/math/floor.gs.ts +88 -0
  277. package/gs/math/fma.gs.test.ts +83 -0
  278. package/gs/math/fma.gs.ts +7 -0
  279. package/gs/math/frexp.gs.test.ts +146 -0
  280. package/gs/math/frexp.gs.ts +37 -0
  281. package/gs/math/gamma.gs.test.ts +66 -0
  282. package/gs/math/gamma.gs.ts +158 -0
  283. package/gs/math/hypot.gs.test.ts +73 -0
  284. package/gs/math/hypot.gs.ts +23 -0
  285. package/gs/math/index.ts +44 -0
  286. package/gs/math/j0.gs.test.ts +74 -0
  287. package/gs/math/j0.gs.ts +257 -0
  288. package/gs/math/j1.gs.test.ts +81 -0
  289. package/gs/math/j1.gs.ts +231 -0
  290. package/gs/math/jn.gs.test.ts +133 -0
  291. package/gs/math/jn.gs.ts +447 -0
  292. package/gs/math/ldexp.gs.test.ts +128 -0
  293. package/gs/math/ldexp.gs.ts +28 -0
  294. package/gs/math/lgamma.gs.test.ts +102 -0
  295. package/gs/math/lgamma.gs.ts +251 -0
  296. package/gs/math/log.gs.test.ts +40 -0
  297. package/gs/math/log.gs.ts +21 -0
  298. package/gs/math/log10.gs.test.ts +80 -0
  299. package/gs/math/log10.gs.ts +25 -0
  300. package/gs/math/log1p.gs.test.ts +55 -0
  301. package/gs/math/log1p.gs.ts +24 -0
  302. package/gs/math/logb.gs.test.ts +87 -0
  303. package/gs/math/logb.gs.ts +54 -0
  304. package/gs/math/mod.gs.test.ts +64 -0
  305. package/gs/math/mod.gs.ts +36 -0
  306. package/gs/math/modf.gs.test.ts +80 -0
  307. package/gs/math/modf.gs.ts +32 -0
  308. package/gs/math/nextafter.gs.test.ts +107 -0
  309. package/gs/math/nextafter.gs.ts +71 -0
  310. package/gs/math/pow.gs.test.ts +103 -0
  311. package/gs/math/pow.gs.ts +55 -0
  312. package/gs/math/pow10.gs.test.ts +58 -0
  313. package/gs/math/pow10.gs.ts +19 -0
  314. package/gs/math/remainder.gs.test.ts +70 -0
  315. package/gs/math/remainder.gs.ts +33 -0
  316. package/gs/math/signbit.gs.test.ts +33 -0
  317. package/gs/math/signbit.gs.ts +8 -0
  318. package/gs/math/sin.gs.test.ts +83 -0
  319. package/gs/math/sin.gs.ts +38 -0
  320. package/gs/math/sincos.gs.test.ts +91 -0
  321. package/gs/math/sincos.gs.ts +15 -0
  322. package/gs/math/sinh.gs.test.ts +66 -0
  323. package/gs/math/sinh.gs.ts +34 -0
  324. package/gs/math/sqrt.gs.test.ts +49 -0
  325. package/gs/math/sqrt.gs.ts +20 -0
  326. package/gs/math/tan.gs.test.ts +50 -0
  327. package/gs/math/tan.gs.ts +23 -0
  328. package/gs/math/tanh.gs.test.ts +52 -0
  329. package/gs/math/tanh.gs.ts +23 -0
  330. package/gs/math/trig_reduce.gs.ts +66 -0
  331. package/gs/math/unsafe.gs.ts +52 -0
  332. package/gs/slices/slices.ts +9 -0
  333. package/gs/strconv/atob.gs.ts +45 -0
  334. package/gs/strconv/atof.gs.ts +60 -0
  335. package/gs/strconv/atoi.gs.ts +243 -0
  336. package/gs/strconv/doc.gs.ts +2 -0
  337. package/gs/strconv/ftoa.gs.ts +66 -0
  338. package/gs/strconv/index.ts +6 -0
  339. package/gs/strconv/itoa.gs.ts +41 -0
  340. package/gs/strconv/quote.gs.ts +245 -0
  341. package/gs/strings/index.ts +4 -0
  342. package/gs/strings/replace.ts +9 -237
  343. package/gs/strings/search.ts +0 -28
  344. package/package.json +1 -1
  345. package/gs/stringslite/godoc.txt +0 -17
  346. package/gs/stringslite/index.ts +0 -1
  347. 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
+