log2 не найден в моем math.h? - PullRequest
       18

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

31 голосов
/ 17 апреля 2009

Я использую довольно новую установку Visual C ++ 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?

Ответы [ 5 ]

59 голосов
/ 17 апреля 2009

С здесь :

Прототип: двойной лог2 (двойной номер);
Заголовочный файл: 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 );  
}  

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

10 голосов
/ 08 марта 2012

Если вы пытаетесь найти 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 ) ) ;
}
10 голосов
/ 20 апреля 2009

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

3 голосов
/ 01 марта 2018

Обратите внимание:

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), я бы посоветовал вместо этого использовать умножение, поскольку деление всегда медленнее, особенно для чисел с плавающей запятой и особенно для мобильных процессоров. Например, на современных процессорах Intel разница в сгенерированном коде всего в одной инструкции mulsd против divsd и согласно руководствам Intel мы можем ожидать, что деление будет 5 В 10 раз медленнее. В процессорах ARM для мобильных устройств я бы ожидал, что деление с плавающей запятой будет где-то на 10-100 медленнее, чем умножение.

Кроме того, в случае, если у вас есть проблемы с компиляцией с log2 для Android, похоже, что log2 доступен в заголовках, начиная с android-18:

#include <android/api-level.h>
#if __ANDROID_API__ < 18
static inline double log2(double n)
{
    return log(n) * M_LOG2E;
}
#endif
3 голосов
/ 23 февраля 2015

В Visual Studio 2013 было добавлено log2(). См. Поддержка библиотеки C99 в Visual Studio 2013 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...