2009-04-16 129 views
29

我正在使用相當新的Visual C++ 2008 Express安裝。在我的math.h中找不到log2?

我試圖編譯一個使用log2函數的程序,該函數是通過在Mac上包含使用Eclipse找到的,但此Windows計算機找不到該函數(錯誤C3861:'log2':標識符未找到)。

我理解它的方式,include目錄是特定於IDE的,對嗎? math.h不存在於我的Microsoft SDKs \ Windows \ v6.0A \ Include \目錄中,但是我在此目錄中找到了一個math.h:Microsoft Visual Studio 9.0 \ VC \ include。在那個目錄中還有一個cmath ...

log2在哪裏?

+0

很多更好的答案[這裏](http://stackoverflow.com/questions/994593/how-to-do-an-integer-log2-in-c) – bobobobo 2013-02-14 17:50:35

回答

56

here

原型:double的log 2(雙aNumber的);
頭文件:文件math.h(C)或CMATH(C++)

備選地仿效它像here

#include <math.h> 
... 
// Calculates log2 of number. 
double Log2(double n) 
{ 
    // log(n)/log(2) is log2. 
    return log(n)/log(2); 
} 

不幸的是微軟does not provide it

+2

`日誌(2)`避免編譯器抱怨模糊的調用 – jirkamat 2012-03-04 10:08:41

+8

您確實應該將log(2)的值存儲爲靜態double或預先計算的常量(0。 30102999566398119521373889472449),這樣`log()`不會每次調用兩次 – bobobobo 2012-03-08 02:47:51

9

log2()僅在C99標準中定義,而不是在C90標準中定義。微軟的Visual C++並不完全符合C99標準(但是,現在沒有一個完全符合C99標準的編譯器,我相信 - 即使GCC完全支持它),所以不需要提供log2()

10

如果你試圖找到嚴格整數log2,一些位不能傷害:

#include <stdio.h> 

unsigned int log2(unsigned int x) 
{ 
    unsigned int ans = 0 ; 
    while(x>>=1) ans++; 
    return ans ; 
} 

int main() 
{ 
    // log(7) = 2 here, log(8)=3. 
    //for(int i = 0 ; i < 32 ; i++) 
    // printf("log_2(%d) = %d\n", i, log2(i)) ; 

    for(unsigned int i = 1 ; i <= (1<<30) ; i <<= 1) 
    printf("log_2(%d) = %d\n", i, log2(i)) ; 
} 
0

的log 2(x)=日誌(X)*日誌(E):

#define _USE_MATH_DEFINES // needed to have definition of M_LOG2E 
#include <math.h> 

static inline double log2(double n) 
{ 
    return log(n) * M_LOG2E; 
} 

在情況下,如果你有編譯問題與log2爲Android,恍如的log 2是從Android的18起頭可用:

#include <android/api-level.h> 
#if __ANDROID_API__ < 18 
static inline double log2(double n) 
{ 
    return log(n) * M_LOG2E; 
} 
#endif