Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在我的数学中找不到log2.h? 我使用了一个新安装的VisualC++ 2008 Express。_C_Visual Studio_Math - Fatal编程技术网

在我的数学中找不到log2.h? 我使用了一个新安装的VisualC++ 2008 Express。

在我的数学中找不到log2.h? 我使用了一个新安装的VisualC++ 2008 Express。,c,visual-studio,math,C,Visual Studio,Math,我正在尝试编译一个使用log2函数的程序,该函数是通过在Mac上使用Eclipse找到的,但此Windows计算机找不到该函数(错误C3861:“log2”:找不到标识符) 按照我的理解,include目录是特定于IDE的,对吗?math.h不在我的Microsoft SDK\Windows\v6.0A\Include\目录中,但我在以下目录中找到了math.h:Microsoft Visual Studio 9.0\VC\Include。该目录中还有一个cmath log2在哪里?来自: 原型

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

按照我的理解,include目录是特定于IDE的,对吗?math.h不在我的Microsoft SDK\Windows\v6.0A\Include\目录中,但我在以下目录中找到了math.h:Microsoft Visual Studio 9.0\VC\Include。该目录中还有一个cmath

log2在哪里?

来自:

原型:双对数2(双对数)
头文件:math.h(C)或cmath(C++)

或者像这样模仿它

#包括
...  
//计算数字的log2。
双对数2(双对数n)
{  
//log(n)/log(2)是log2。
返回日志(n)/log(2);
}  

不幸的是,Microsoft。

log2()
仅在C99标准中定义,而不是在C90标准中定义。微软Visual C++不完全符合C99(Heck,没有一个完全的C99兼容编译器,我相信——甚至GCC都不支持它),所以它不需要提供<代码> Log2>(< /代码> .< /p> < p>如果您要查找严格整数的<代码> 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 ) ) ;
}
#包括
无符号整数log2(无符号整数x)
{
无符号整数ans=0;
而(x>>=1)ans++;
返回ans;
}
int main()
{
//这里log(7)=2,log(8)=3。
//对于(int i=0;i<32;i++)
//printf(“log_2(%d)=%d\n”,i,log2(i));

对于Visual Studio 2013中的(unsigned int i=1;i,添加了
log2()
。请参见。

注意:

对数2(x)=对数(x)*对数(e)

其中log(e)是一个常数。
math.h
M_LOG2E
定义为
log(e)
的值,如果在包含
math.h
之前定义

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

log(2.)
为了避免编译器抱怨不明确的调用,您确实应该将log(2)的值存储为静态双精度或预计算常量(0.30129999566398119521373889472449),这样
log()
就不会每次调用两次timelog(2)应该由一个好的优化器优化为常量静态。我已经在vc2008中使用了一个测试用例验证了这一点,最好不要使用手写常量。这确保了与其他运行时函数的数值一致性,不是说几个小数会成问题,而是无论如何。@bobobo自然对数的基数是
E
,而不是
10
,因此
log(2)~=0.69314718055994530943
在数学中定义了M_LN2常量。当然,这会有很多更好的答案,但它的性能比log2(n)差得多。log2有一个恒定的时间,并且总是更快。这个解决方案是O(log2n)。对于大量的log2,速度大约快500%。是的,它会影响性能和质量。更多的代码=更多可能的错误源。@ruralcoder
ln
的计算时间是。因此,这种计算
log_u2;(base2)
整数的方法是
log_2;(base2)(x)
,效率更高。@bobobo不,查找下限(log2(a))最有效的方法是使用单一汇编指令bsr(假设您使用的是x86;其他体系结构也有类似的指令)。请参阅,只有当输入为2的幂次方时,此代码才有效-它对其他整数无效(其中log2为非整数)!@Adam P.Goucher说得对,这返回了floor(log2(a))。如果在输入不能保证为2的幂的情况下需要一个通用log2函数,那么可接受的答案(上面)就是要使用的答案。
#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;
}
#include <android/api-level.h>
#if __ANDROID_API__ < 18
static inline double log2(double n)
{
    return log(n) * M_LOG2E;
}
#endif