# [MLton-devel] Real.fromLargeInt

Stephen Weeks MLton@mlton.org
Tue, 22 Oct 2002 15:48:21 -0700

```Can someone please check my work on Real.fromLargeInt, which has been
long missing from MLton's basis library.

structure Real =
struct
open Real

val fromLargeInt: IntInf.int -> real =
let
val m = 52 (* The number of mantissa bits in 64 bit IEEE 854. *)
val half = Int.quot (m, 2)
val two = IntInf.fromInt 2
fun pos (i: IntInf.int): real =
let
val exp: Int.int = IntInf.log2 i
in
if Int.< (exp, Int.- (valOf Int.precision, 1))
then Real.fromInt (IntInf.toInt i)
else if Int.>= (exp, 1024)
then Real.posInf
else
let
val shift = Int.- (exp, m)
val man: IntInf.int =
if Int.>= (shift, 0)
then IntInf.quot (i, IntInf.pow (two, shift))
else IntInf.* (i, IntInf.pow (two, Int.~ shift))
(* 2^m <= man < 2^(m+1) *)
val (q, r) = IntInf.quotRem (man, IntInf.pow (two, half))
fun fromManExp (man, exp) =
Real.fromManExp
{man = Real.fromInt (IntInf.toInt man),
exp = exp}
in
fromManExp (q, Int.+ (half, shift))
+ fromManExp (r, shift)
end
end
in
fn i =>
case IntInf.compare (i, IntInf.fromInt 0) of
LESS => ~ (pos (IntInf.~ i))
| EQUAL => 0.0
| GREATER => pos i
end
end

-------------------------------------------------------
This sf.net emial is sponsored by: Influence the future
of Java(TM) technology. Join the Java Community
Process(SM) (JCP(SM)) program now.