4 ms·
inline uint32_t Log2(uint32_t x) { const union { float f; uint32_t i; } converter = { (float)x }; return (converter.i >> 23) - 127; } This is
by mywittyname 4y ago
inline uint32_t Log2(uint32_t x)
{
const union { float f; uint32_t i; } converter = { (float)x };
return (converter.i >> 23) - 127;
}
This is interesting. It looks like it's returning the (biased corrected) value of mantissa.
I'm surprised that there isn't a function supplied by the compilers or in the processor that takes an int and returns the mantissa. After all, every int -> float conversion requires this step.
- electroly 4y agoTake a look at the C header <ieee754.h>. It's not on all systems but it provides a union for type punning between a double and its decomposed parts. IEEE754_DOUBLE_BIAS is provided for bias correction. The same are available for floats. (Unfortunately, the "not on all systems" part is why I don't use it, but instead copy the union and the constant verbatim into the project if I need it.)
- asveikau 4y agoI thought that type punning via union is against the standard. I personally do not think it should be ... It's a very handy tool.
- electroly 4y agoI think it may be a GNU extension to explicitly allow it, but I'm no language lawyer. This header is from glibc; it may explain why it's not available on some platforms.
- 10000truths 4y agoModern CPUs have a count-leading-zeros instruction to calculate floor(log2(x)) efficiently. GCC and clang expose this with the __builtin_clz* family of intrinsics. MSVC exposes this with _BitScanReverse. static inline uint64_t floor_log2(uint64_t x) { return 63 - __builtin_clzll(x); }
- vinkelhake 4y agoAnd C++ (as of C++20) exposes this and more in the header <bit>. https://en.cppreference.com/w/cpp/header/bit https://en.cppreference.com/w/cpp/header/bit
- ot 4y ago> It looks like it's returning the (biased corrected) value of mantissa. I think you mean exponent?
- mywittyname 4y agoYes, oops.
- thechao 4y agohttps://en.cppreference.com/w/c/numeric/math/frexp https://en.cppreference.com/w/c/numeric/math/frexp