@@ -24,6 +24,9 @@ use Numbers.{
2424 coerceFloat64ToNumber as toNumber,
2525}
2626
27+ @unsafe
28+ let _VALUE_OFFSET = 8n
29+
2730/**
2831 * Infinity represented as a Float64 value.
2932 * This is an alternative to the `Infinityd` literal.
@@ -81,8 +84,8 @@ provide { fromNumber, toNumber }
8184 */
8285@unsafe
8386provide let (+) = (x: Float64, y: Float64) => {
84- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
85- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
87+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
88+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
8689 let ptr = newFloat64(xv + yv)
8790 WasmI32.toGrain(ptr): Float64
8891}
@@ -103,8 +106,8 @@ provide let (+) = (x: Float64, y: Float64) => {
103106 */
104107@unsafe
105108provide let (-) = (x: Float64, y: Float64) => {
106- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
107- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
109+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
110+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
108111 let ptr = newFloat64(xv - yv)
109112 WasmI32.toGrain(ptr): Float64
110113}
@@ -125,8 +128,8 @@ provide let (-) = (x: Float64, y: Float64) => {
125128 */
126129@unsafe
127130provide let (*) = (x: Float64, y: Float64) => {
128- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
129- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
131+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
132+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
130133 let ptr = newFloat64(xv * yv)
131134 WasmI32.toGrain(ptr): Float64
132135}
@@ -147,8 +150,8 @@ provide let (*) = (x: Float64, y: Float64) => {
147150 */
148151@unsafe
149152provide let (/) = (x: Float64, y: Float64) => {
150- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
151- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
153+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
154+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
152155 let ptr = newFloat64(xv / yv)
153156 WasmI32.toGrain(ptr): Float64
154157}
@@ -169,8 +172,8 @@ provide let (/) = (x: Float64, y: Float64) => {
169172 */
170173@unsafe
171174provide let (<) = (x: Float64, y: Float64) => {
172- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
173- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
175+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
176+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
174177 xv < yv
175178}
176179
@@ -190,8 +193,8 @@ provide let (<) = (x: Float64, y: Float64) => {
190193 */
191194@unsafe
192195provide let (>) = (x: Float64, y: Float64) => {
193- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
194- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
196+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
197+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
195198 xv > yv
196199}
197200
@@ -215,8 +218,8 @@ provide let (>) = (x: Float64, y: Float64) => {
215218 */
216219@unsafe
217220provide let (<=) = (x: Float64, y: Float64) => {
218- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
219- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
221+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
222+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
220223 xv <= yv
221224}
222225
@@ -240,7 +243,75 @@ provide let (<=) = (x: Float64, y: Float64) => {
240243 */
241244@unsafe
242245provide let (>=) = (x: Float64, y: Float64) => {
243- let xv = WasmF64.load(WasmI32.fromGrain(x), 8n )
244- let yv = WasmF64.load(WasmI32.fromGrain(y), 8n )
246+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET )
247+ let yv = WasmF64.load(WasmI32.fromGrain(y), _VALUE_OFFSET )
245248 xv >= yv
246249}
250+
251+ /**
252+ * Checks if the value is a float NaN value (Not A Number).
253+ *
254+ * @param x: The value to check
255+ * @returns `true` if the value is NaN, otherwise `false`
256+ *
257+ * @example Float64.isNaN(NaNd)
258+ * @example Float64.isNaN(Infinityd) == false
259+ * @example Float64.isNaN(-Infinityd) == false
260+ * @example Float64.isNaN(0.5d) == false
261+ * @example Float64.isNaN(1.0d) == false
262+ *
263+ * @since v0.6.5
264+ */
265+ provide let isNaN = (x: Float64) => x != x
266+
267+ /**
268+ * Checks if a float is infinite, that is either of positive or negative infinity.
269+ *
270+ * @param x: The value to check
271+ * @returns `true` if the value is infinite or `false` otherwise
272+ *
273+ * @example Float64.isInfinite(Infinityd)
274+ * @example Float64.isInfinite(-Infinityd)
275+ * @example Float64.isInfinite(NaNd) == false
276+ * @example Float64.isInfinite(0.5d) == false
277+ * @example Float64.isInfinite(1.0d) == false
278+ *
279+ * @since v0.6.5
280+ */
281+ provide let isInfinite = (x: Float64) => x == Infinityd || x == -Infinityd
282+
283+ /**
284+ * Returns the absolute value. That is, it returns `x` if `x` is positive or zero and the negation of `x` if `x` is negative.
285+ *
286+ * @param x: The operand
287+ * @returns The absolute value of the operand
288+ *
289+ * @example Float64.abs(-1.0d) == 1.0d
290+ * @example Float64.abs(5.0d) == 5.0d
291+ *
292+ * @since v0.6.5
293+ */
294+ @unsafe
295+ provide let abs = (x: Float64) => {
296+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET)
297+ let ptr = newFloat64(WasmF64.abs(xv))
298+ WasmI32.toGrain(ptr): Float64
299+ }
300+
301+ /**
302+ * Returns the negation of its operand.
303+ *
304+ * @param x: The operand
305+ * @returns The negated operand
306+ *
307+ * @example Float64.neg(-1.0d) == 1.0d
308+ * @example Float64.neg(1.0d) == -1.0d
309+ *
310+ * @since v0.6.5
311+ */
312+ @unsafe
313+ provide let neg = (x: Float64) => {
314+ let xv = WasmF64.load(WasmI32.fromGrain(x), _VALUE_OFFSET)
315+ let ptr = newFloat64(WasmF64.neg(xv))
316+ WasmI32.toGrain(ptr): Float64
317+ }
0 commit comments