ref: 5045a7db15fc9cee696c319889b1f81e464b12a3
parent: 9b7397fb8de58d9c9af0a6458d54f635e8415f65
author: Ori Bernstein <[email protected]>
date: Fri Jan 24 15:26:21 EST 2014
Add explode() functions to our floatbits code.
--- a/libstd/floatbits.myr
+++ b/libstd/floatbits.myr
@@ -3,8 +3,58 @@
const float32bits : (flt : float32 -> uint32)
const float64frombits : (bits : uint64 -> float64)
const float32frombits : (bits : uint32 -> float32)
+ const float64explode : (flt : float64 -> [bool, uint64, int32])
+ const float32explode : (flt : float64 -> [bool, uint64, int32])
;;
+
const float64bits = {flt; -> (&flt castto(uint64#))#}
const float32bits = {flt; -> (&flt castto(uint32#))#}
const float64frombits = {bits; -> (&bits castto(float64#))#}
const float32frombits = {bits; -> (&bits castto(float32#))#}
+
+const float64explode = {flt
+ var bits, isneg, mant, exp
+
+ bits = float64bits(flt)
+ isneg = (bits >> 63) == 0 /* msb is sign bit */
+ exp = (bits >> 52) & 0x7ff /* exp is in bits [52..63] */
+ mant = bits & ((1ul << 52) - 1) /* msb is in bits [..51] */
+
+ /* add back the implicit bit if this is not a denormal */
+ if exp != 0
+ mant |= 1ul << 52
+ else
+ exp = 1
+ ;;
+ /*
+ adjust for exponent bias. nb: because we are
+ treating the mantissa as m.0 instead of 0.m,
+ our exponent bias needs to be offset by the
+ size of m
+ */
+ -> (isneg, mant, (exp castto(int32)) - 1075)
+}
+
+const float32explode = {flt
+ var bits, isneg, mant, exp
+
+ bits = float64bits(flt) castto(uint64)
+ isneg = (bits >> 31) == 0 /* msb is sign bit */
+ exp = (bits >> 22) & 0xff /* exp is in bits [23..30] */
+ mant = bits & ((1ul << 52) - 1) /* msb is in bits [0..22] */
+
+ /* add back the implicit bit if this is not a denormal */
+ if exp != 0
+ mant |= 1ul << 22
+ else
+ exp = 1
+ ;;
+ /*
+ adjust for exponent bias. nb: because we are
+ treating the mantissa as m.0 instead of 0.m,
+ our exponent bias needs to be offset by the
+ size of m
+ */
+ -> (isneg, mant, (exp castto(int32)) - 149)
+}
+