Add utility function for integer dynamic range extension encoding
This commit is contained in:
@@ -162,3 +162,23 @@ uint32 IntCbrt(uint64 num)
|
|||||||
|
|
||||||
return ((uint32) r1); /* floor(cbrt(x)); */
|
return ((uint32) r1); /* floor(cbrt(x)); */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compress unsigned integer into 16 bits, in a way that increases dynamic range, at the expense of precision for large values
|
||||||
|
*/
|
||||||
|
uint16 RXCompressUint(uint32 num)
|
||||||
|
{
|
||||||
|
if (num <= 0x100) return num;
|
||||||
|
if (num <= 0x7900) return 0x100 + ((num - 0x100) >> 3);
|
||||||
|
return std::min<uint32>(UINT16_MAX, 0x1000 + ((num - 0x7900) >> 6));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inverse of RXCompressUint
|
||||||
|
*/
|
||||||
|
uint32 RXDecompressUint(uint16 num)
|
||||||
|
{
|
||||||
|
if (num > 0x1000) return ((num - 0x1000) << 6) + 0x7900;
|
||||||
|
if (num > 0x100) return ((num - 0x100) << 3) + 0x100;
|
||||||
|
return num;
|
||||||
|
}
|
||||||
|
@@ -376,4 +376,7 @@ uint32 IntSqrt(uint32 num);
|
|||||||
uint32 IntSqrt64(uint64 num);
|
uint32 IntSqrt64(uint64 num);
|
||||||
uint32 IntCbrt(uint64 num);
|
uint32 IntCbrt(uint64 num);
|
||||||
|
|
||||||
|
uint16 RXCompressUint(uint32 num);
|
||||||
|
uint32 RXDecompressUint(uint16 num);
|
||||||
|
|
||||||
#endif /* MATH_FUNC_HPP */
|
#endif /* MATH_FUNC_HPP */
|
||||||
|
Reference in New Issue
Block a user