快速log2(浮点x)实现C

我需要在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;
}

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...