我需要在C中实现非常快速的log2(float x)函数.
我发现了一个非常有趣的实现(非常快!)
#include <intrin.h> inline unsigned long log2(int x) { unsigned long y; _BitScanReverse(&y,x); return y; }
但是此函数仅适用于输入中的整数值.
问题:有没有办法将此函数转换为double类型的输入变量?
UPD:
我找到了这个实现:
typedef unsigned long uint32; typedef long int32; static inline int32 ilog2(float x) { uint32 ix = (uint32&)x; uint32 exp = (ix >> 23) & 0xFF; int32 log2 = int32(exp) - 127; return log2; }
这比前一个示例快得多,但输出是无符号类型.
是否可以使此函数返回double类型?
提前致谢!
解决方法
如果只需要对数的整数部分,则可以直接从浮点数中提取.
可移植:
#include <cmath> int log2_fast(double d) { int result; std::frexp(d,&result); return result-1; }
可能更快,但依赖于未指定和未定义的行为:
int log2_evil(double d) { return ((reinterpret_cast<unsigned long long&>(d) >> 52) & 0x7ff) - 1023; }