ref: cbf8e144771b88703180db26d74f1c65e45d84fe
dir: /lib/math/round-impl.myr/
use std
use "util"
pkg math =
const rn64 : (x : flt64 -> int64)
const rn32 : (x : flt32 -> int32)
;;
const rn64 = {x : flt64
var n : bool, e : int64, s : uint64
(n, e, s) = std.flt64explode(x)
if e >= 63
-> -9223372036854775808
elif e >= 52
var shifted : int64 = (( s << (e - 52 : uint64)) : int64)
if n
-> -1 * shifted
else
-> shifted
;;
elif e < -1
-> 0
;;
var integral_s = (s >> (52 - e : uint64) : int64)
if need_round_away(0, s, 52 - e)
integral_s++
;;
if n
-> -integral_s
else
-> integral_s
;;
}
const rn32 = {x : flt32
var n : bool, e : int32, s : uint32
(n, e, s) = std.flt32explode(x)
if e >= 31
-> -2147483648
elif e >= 23
var shifted : int32 = (( s << (e - 23 : uint32)) : int32)
if n
-> -1 * shifted
else
-> shifted
;;
elif e < -1
-> 0
;;
var integral_s = (s >> (23 - e : uint32) : int32)
if need_round_away(0, (s : uint64), (23 - e : int64))
integral_s++
;;
if n
-> -integral_s
else
-> integral_s
;;
}