, exp2s
, exp2
+
+ , countBits
)
where
import Data.Int
fromIntegral w'''
-- | Convert a packed weight to internal weight (+/-1024). Note that
--- the following equation might not hold because 'packWeight' is
+-- the following equation /might not hold/ because 'packWeight' is
-- lossy.
--
-- > unpackWeight . packWeight = id
-- zero and can therefore represent both zero and negative
-- values. They have 8 bits of precision and in \"roundtrip\"
-- conversions the total error never exceeds 1 part in 225 except for
--- the cases of +/-115 and +/-195 (which error by 1).
+-- the cases of +\/-115 and +\/-195 (which error by 1).
--
-- This function returns the log2 for the specified 32-bit unsigned
-- value. The maximum value allowed is about 0xff800000 and returns
else
exp2l `shiftL` fromIntegral (l' - 9)
+-- | 'countBits' @av@ returns the number of bits that is required to
+-- represent @av@.
+countBits ∷ Word32 → Word8
+countBits av
+ | av < (1 `shiftL` 8) = getNBits (fromIntegral av)
+ | av < (1 `shiftL` 16) = getNBits (fromIntegral (av `shiftR` 8)) + 8
+ | av < (1 `shiftL` 24) = getNBits (fromIntegral (av `shiftR` 16)) + 16
+ | otherwise = getNBits (fromIntegral (av `shiftR` 24)) + 24
+
getNBits ∷ Word8 → Word8
getNBits = UV.unsafeIndex nbitsTable ∘ fromIntegral
where