2009-04-16 124 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