我需要在C++中快速實現log2(float x)函數。快速log2(float x)實現C++
我發現一個很有趣的實現(和極快!)
#include <intrin.h>
inline unsigned long log2(int x)
{
unsigned long y;
_BitScanReverse(&y, x);
return y;
}
但是這個功能只適用於輸入整數值不錯。
問題:有沒有什麼辦法將這個函數轉換爲double type input variable?
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;
}
比前面的例子要快得多,但輸出是無符號的類型。
是否可以使這個函數返回一個雙類型?
在此先感謝!
這是一個很奇怪的要求,因爲對數與基地2很少用於任何東西,除了計算位數的東西,當你計算位數時,你使用整數。那麼你需要什麼? – 2012-02-23 11:18:59
@JanHudec:關於我的頭頂,對數的兩種常見用法是計算信號的熵,並對非常大的數字進行算術運算,否則將會溢出。 – 2012-02-23 11:32:30
@MikeSeymour:對於信號來說,很少是浮點數而不是整數。對於大數的算術,你不需要基數2,並且可能使用自然對數,因爲數學通常用那個來表示。 – 2012-02-23 12:12:32