Подтвердить что ты не робот

Log2 не найден в моей math.h?

Я использую довольно новую установку Visual С++ 2008 Express.

Я пытаюсь скомпилировать программу, которая использует функцию log2, которая была найдена путем включения Eclipse на Mac, но этот компьютер Windows не может найти функцию (ошибка C3861: "log2": идентификатор не найден).

То, как я это понял, включает каталоги, специфичные для IDE, не так ли? math.h отсутствует в каталоге Microsoft SDK\Windows\v6.0A\Include \, но я нашел math.h в этом каталоге: Microsoft Visual Studio 9.0\VC\include. В этом каталоге есть cmath...

Где log2?

4b9b3361

Ответ 1

Из здесь:

Прототип: двойной log2 (двойной номер);
 Файл заголовка: math.h(C) или cmath (С++)

Альтернативно эмулируйте его как здесь

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

К сожалению, Microsoft не предоставляет его.

Ответ 2

Если вы пытаетесь найти 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 ) ) ;
}

Ответ 3

log2() определяется только в стандарте C99, а не в стандарте C90. Microsoft Visual С++ не полностью совместим с C99 (черт возьми, не существует ни одного полностью совместимого с C99 компилятора, я считаю - даже GCC полностью не поддерживает его), поэтому не требуется предоставлять log2().