[MLton-commit] r6290
Vesa Karvonen
vesak at mlton.org
Sun Dec 23 08:45:45 PST 2007
Minor simplification/optimization of FP class and rounding mode
conversions.
----------------------------------------------------------------------
U mlton/trunk/basis-library/real/IEEE-real.sml
----------------------------------------------------------------------
Modified: mlton/trunk/basis-library/real/IEEE-real.sml
===================================================================
--- mlton/trunk/basis-library/real/IEEE-real.sml 2007-12-23 11:16:56 UTC (rev 6289)
+++ mlton/trunk/basis-library/real/IEEE-real.sml 2007-12-23 16:45:44 UTC (rev 6290)
@@ -24,30 +24,26 @@
| SUBNORMAL
| ZERO
- local
- val classes =
- let
- open Prim.FloatClass
- in
- (* order here is chosen based on putting the more
- * commonly used classes at the front.
- *)
- [(FP_NORMAL, NORMAL),
- (FP_ZERO, ZERO),
- (FP_INFINITE, INF),
- (FP_NAN, NAN),
- (FP_SUBNORMAL, SUBNORMAL)]
- end
- in
- fun mkClass class x =
- let
- val i = class x
- in
- case List.find (fn (i', _) => i = i') classes of
- NONE => raise Fail "Real_class returned bogus integer"
- | SOME (_, c) => c
- end
- end
+ fun mkClass class x =
+ let
+ val i = class x
+ open Prim.FloatClass
+ in
+ (* order here is chosen based on putting the more
+ * commonly used classes at the front.
+ *)
+ if i = FP_NORMAL
+ then NORMAL
+ else if i = FP_ZERO
+ then ZERO
+ else if i = FP_INFINITE
+ then INF
+ else if i = FP_NAN
+ then NAN
+ else if i = FP_SUBNORMAL
+ then SUBNORMAL
+ else raise Fail "Real_class returned bogus integer"
+ end
structure RoundingMode =
struct
@@ -57,39 +53,35 @@
| TO_POSINF
| TO_ZERO
- local
- val modes =
- let
- open Prim.RoundingMode
- in
- [(FE_TONEAREST, TO_NEAREST),
- (FE_DOWNWARD, TO_NEGINF),
- (FE_UPWARD, TO_POSINF),
- (FE_TOWARDZERO, TO_ZERO)]
- end
- in
- val fromInt: C_Int.int -> t =
- fn i =>
- case List.find (fn (i', _) => i = i') modes of
- NONE => raise Fail "IEEEReal.RoundingMode.fromInt"
- | SOME (_, m) => m
+ fun fromInt (i: C_Int.int): t =
+ let
+ open Prim.RoundingMode
+ in
+ if i = FE_TONEAREST
+ then TO_NEAREST
+ else if i = FE_DOWNWARD
+ then TO_NEGINF
+ else if i = FE_UPWARD
+ then TO_POSINF
+ else if i = FE_TOWARDZERO
+ then TO_ZERO
+ else raise Fail "IEEEReal.RoundingMode.fromInt"
+ end
- val toInt: t -> C_Int.int =
- fn m =>
- let
- open Prim.RoundingMode
- val i =
- case m of
- TO_NEAREST => FE_TONEAREST
- | TO_NEGINF => FE_DOWNWARD
- | TO_POSINF => FE_UPWARD
- | TO_ZERO => FE_TOWARDZERO
- in
- if i = FE_NOSUPPORT
- then raise Fail "IEEEReal rounding mode not supported"
- else i
- end
- end
+ fun toInt (m: t): C_Int.int =
+ let
+ open Prim.RoundingMode
+ val i =
+ case m of
+ TO_NEAREST => FE_TONEAREST
+ | TO_NEGINF => FE_DOWNWARD
+ | TO_POSINF => FE_UPWARD
+ | TO_ZERO => FE_TOWARDZERO
+ in
+ if i = FE_NOSUPPORT
+ then raise Fail "IEEEReal rounding mode not supported"
+ else i
+ end
end
datatype rounding_mode = datatype RoundingMode.t
More information about the MLton-commit
mailing list