From 1cfbb2c66bb0881008ebe1e62ec68a05a923f2cb Mon Sep 17 00:00:00 2001 From: ARATA Mizuki Date: Fri, 7 Jul 2023 09:27:07 +0900 Subject: [PATCH] Mark IntInf.realBase as discardable --- lib/lunarml/ml/basis/int-inf.sml | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/lunarml/ml/basis/int-inf.sml b/lib/lunarml/ml/basis/int-inf.sml index e190eaf8..0cf4e0a7 100644 --- a/lib/lunarml/ml/basis/int-inf.sml +++ b/lib/lunarml/ml/basis/int-inf.sml @@ -1043,19 +1043,21 @@ fun fromIntegralReal (x : real) = if x == 0.0 then else POSITIVE (adjust (go y)) end -val realBase : real = (* case Word.wordSize of - 32 => 0x1p32 - | 64 => 0x1p64 - | _ => *) let fun pow (a, 0, acc) = acc - | pow (a, 1, acc) = acc * a - | pow (a, n, acc) = let val q = n div 2 - in if n mod 2 = 0 then - pow (a * a, q, acc) - else - pow (a * a, q, acc * a) - end - in pow (2.0, Word.wordSize, 1.0) - end +val realBase : real = LunarML.assumeDiscardable (fn () => + (* case Word.wordSize of + 32 => 0x1p32 + | 64 => 0x1p64 + | _ => *) let fun pow (a, 0, acc) = acc + | pow (a, 1, acc) = acc * a + | pow (a, n, acc) = let val q = n div 2 + in if n mod 2 = 0 then + pow (a * a, q, acc) + else + pow (a * a, q, acc * a) + end + in pow (2.0, Word.wordSize, 1.0) + end + ) () fun wordToReal 0w0 = 0.0 | wordToReal w = wordToReal (UncheckedWord.>> (w, 0w31)) * 0x1p31 + Real.fromInt (Word.toInt (Word.andb (w, 0wx7fffffff))) fun simpleNatToReal words = Vector.foldr (fn (w, acc) => acc * realBase + wordToReal w) 0.0 words