当前位置:  开发笔记 > Android > 正文

在我的math.h中找不到log2?

如何解决《在我的math.h中找不到log2?》经验,为你挑选了3个好方法。

我正在使用相当新的Visual C++ 2008 Express安装.

我正在尝试编译一个使用log2函数的程序,该程序是通过在Mac上使用Eclipse而找到的,但是这台Windows计算机找不到该函数(错误C3861:'log2':未找到标识符).

我理解它的方式,包括目录是IDE特有的,对吧?我的Microsoft SDKs\Windows\v6.0A\Include \目录中没有math.h,但我确实在这个目录中找到了math.h:Microsoft Visual Studio 9.0\VC\include.该目录中还有一个cmath ......

log2在哪里?



1> lothar..:

从这里:

原型:双log2(双倍数);
头文件:math.h(C)或cmath(C++)

或者像这里一样模仿它

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

不幸的是,微软不提供它.


你真的应该将log(2)的值存储为静态双精度或预计算常量(0.30102999566398119521373889472449),以便每次都不会调用`log()`两次
log(2)应该由优秀的优化器优化为const static.我已经使用vc2008中的测试用例验证了这一点,最好不要使用手写常量.这确保了与其他运行时函数的数字一致性,而不是几个小数将是一个问题,但无论如何.
math.h中定义了M_LN2常量
`log(2.)`以避免编译器抱怨暧昧的电话

2> Adam Rosenfi..:

log2()仅在C99标准中定义,而不是C90标准.Microsoft Visual C++并不完全符合C99(哎呀,现在没有一个完全符合C99标准的编译器,我相信 - 甚至GCC都不支持它),因此不需要提供log2().



3> bobobobo..:

如果你试图找到log2严格的整数,一些按位不会伤害:

#include 

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 ) ) ;
}


当然这会起作用,但它的性能比log2(n)差很多.Log2具有恒定的时间并且总是更快.该解决方案是O(log2n).对于大量log2,速度提高约500%.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有