diff options
Diffstat (limited to 'klm/util/bit_packing.cc')
| -rw-r--r-- | klm/util/bit_packing.cc | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/klm/util/bit_packing.cc b/klm/util/bit_packing.cc new file mode 100644 index 00000000..dd14ffe1 --- /dev/null +++ b/klm/util/bit_packing.cc @@ -0,0 +1,27 @@ +#include "util/bit_packing.hh" +#include "util/exception.hh" + +namespace util { + +namespace { +template <bool> struct StaticCheck {}; +template <> struct StaticCheck<true> { typedef bool StaticAssertionPassed; }; + +typedef StaticCheck<sizeof(float) == 4>::StaticAssertionPassed FloatSize; + +} // namespace + +uint8_t RequiredBits(uint64_t max_value) { +  if (!max_value) return 0; +  uint8_t ret = 1; +  while (max_value >>= 1) ++ret; +  return ret; +} + +void BitPackingSanity() { +  const detail::FloatEnc neg1 = { -1.0 }, pos1 = { 1.0 }; +  if ((neg1.i ^ pos1.i) != 0x80000000) UTIL_THROW(Exception, "Sign bit is not 0x80000000"); +  // TODO: more checks.   +} + +} // namespace util | 
