programing

log2가 내 수학에서 발견되지않았습니까?

padding 2023. 10. 10. 20:08
반응형

log2가 내 수학에서 발견되지않았습니까?

Visual C++ 2008 Express의 상당히 새로운 설치를 사용하고 있습니다.

Mac에서 Eclipse를 사용하는 것을 포함하여 발견된 log2 함수를 사용하는 프로그램을 컴파일하려고 하는데 이 Windows 컴퓨터에서 함수를 찾을 수 없습니다(오류 C3861: 'log2': identifier not found).

IDE에 고유한 디렉토리를 포함하는 것으로 알고 있습니다. math.h는 Microsoft SDKs\Windows\v6.0에 없습니다.A\Include\ 디렉토리를 찾았지만 이 디렉토리에서 math.h를 찾았습니다. Microsoft Visual Studio 9.0\VC\include.그 디렉토리에 cmath도 있습니다...

log2는 어디에 있습니까?

여기서부터:

프로토타입: double log2(double a number);
헤더 파일: math.h(C) 또는 cmath(C++)

또는 여기와 같이 에뮬레이트합니다.

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

안타깝게도 마이크로소프트는 그것을 제공하지 않습니다.

log2()C90 표준이 아닌 C99 표준에만 정의되어 있습니다.Microsoft Visual C++는 완전한 C99 호환 컴파일러가 없으므로(이런, 완전한 C99 호환 컴파일러는 존재하지 않습니다. GCC도 완전히 지원하지 않습니다.) 제공할 필요가 없습니다.log2().

당신이 찾으려 한다면,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 ) ) ;
}

Visual Studio 2013을 통해서.log2()가 추가되었습니다.Visual Studio 2013에서 C99 라이브러리 지원을 참조하십시오.

참고:

log2(x) = log(x) * log(e)

여기서 log(e)는 상수입니다.math.h정의합니다.M_LOG2E의 가치까지log(e)정의한다면_USE_MATH_DEFINES포함하기 전에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(n)/log(2), 특히 이동식 CPU의 경우 분할 속도가 항상 느리기 때문에 대신 곱셈을 사용하는 것이 좋습니다.예를 들어, 현대의 인텔 CPU에서는 mulddivsd 하나의 명령어에서 생성된 코드의 차이가 발생하며, 인텔 매뉴얼에 따르면 분할 속도가 5-10배 느릴 것으로 예상할 수 있습니다.모바일 ARM CPU에서는 부동 소수점 분할이 곱셈보다 10-100 정도 느릴 것으로 예상됩니다.

또한, 다음과 같은 컴파일 문제가 있는 경우log2Android의 경우, log2는 Android-18부터 시작하는 헤더에서 사용할 수 있는 것 같습니다.

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

언급URL : https://stackoverflow.com/questions/758001/log2-not-found-in-my-math-h

반응형