float>small-bits ( x fraction-bits exponent-bits -- bits )


Vocabulary
math.floats.small.private

Inputs
xan object
fraction-bitsan object
exponent-bitsan object


Outputs
bitsan object


Definition


:: float>small-bits
( x fraction-bits exponent-bits -- bits )
x >float double>bits :> raw raw -48 shift 32768 bitand
:> sign raw -52 shift 2047 bitand :> exponent raw 52 bits
:> fraction exponent-bits 2^ 1 -
:> max-exponent exponent-bits 1 - 2^ 1 -
:> bias exponent 2047 = [
fraction zero?
[ sign max-exponent fraction-bits shift bitor ] [
max-exponent fraction-bits shift 1 fraction-bits 1 -
shift bitor
] if
] [
exponent zero?
[ fraction -1074 ]
[ fraction 52 2^ bitor exponent 1075 - ] if
:> ( significand power ) significand zero?
[ sign ] [
significand log2 :> top top power + bias +
:> target-exponent! target-exponent max-exponent >=
[ sign max-exponent fraction-bits shift bitor ] [
target-exponent 0 <= [
significand power bias + fraction-bits + 1 -
round-binary-shift sign bitor
] [
significand fraction-bits top -
round-binary-shift
:> rounded! rounded fraction-bits 1 + 2^ >=
[
rounded -1 shift
rounded! target-exponent 1 +
target-exponent!
] when target-exponent max-exponent >= [
sign max-exponent fraction-bits shift
bitor
] [
sign target-exponent fraction-bits shift
bitor rounded fraction-bits 2^ - bitor
] if
] if
] if
] if
] if ;