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

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

Отсюда :

Прототип: двойной 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 ); } 

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

Если вы пытаетесь найти 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() определяется только в стандарте C99, а не в стандарте C90. Microsoft Visual C ++ не полностью совместим с C99 (черт возьми, не существует ни одного полностью совместимого с C99 компилятора, я считаю – даже GCC полностью не поддерживает его), поэтому не требуется предоставлять log2() .

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

Обратите внимание, что:

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  static inline double log2(double n) { return log(n) * M_LOG2E; } 

Хотя обычный подход заключается в том, чтобы делать log(n)/log(2) , я бы посоветовал вместо этого использовать умножение, поскольку деление всегда медленнее, особенно для float и т. Д. На мобильных процессорах. Например, на современных процессорах Intel разница в сгенерированном коде в одной команде mulsd vs divsd и согласно руководствам Intel, мы могли ожидать, что деление будет в 5-10 раз медленнее. На мобильном ARM-процессоре я ожидал бы, что деление с плавающей запятой будет где-то на 10-100 медленнее, чем умножение.

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

 #include  #if __ANDROID_API__ < 18 static inline double log2(double n) { return log(n) * M_LOG2E; } #endif 
  • Ограничения на установку расширений или надстроек в Visual Studio 2010 Express
  • Всегда запускайте Visual Studio в качестве администратора в Windows 8
  • Почему Visual Studio не может найти мою DLL?
  • Эквивалент AssemblyInfo в ядре dotnet / csproj
  • Возможно ли создать приложение для Windows 8 Store из Visual Studio 2013?
  • Как использовать class из одного проекта C # с другим проектом C #
  • Могу ли я использовать компилятор C ++ Visual Studio 2010 с Visual Studio 2008 C ++ Runtime Library?
  • отладочная информация не может быть найдена или не соответствует визуальной студии
  • Добавление руководства к редактору в Visual Studio
  • Как загрузить пакет Nuget без расширения nuget.exe или Visual Studio?
  • Использовать Visual Studio 2012 и компилироваться со старым набором инструментов платформы?
  • Interesting Posts

    Изменение положения popup popposts на основе X-позиции popover относительно края windows?

    Как заставить Windows 7 создать новый профиль домена с тем же именем, что и существующий?

    Node.js – EJS – включая частичную

    Как вы поддерживаете Microsoft Excel на полной скорости, даже если у него нет фокуса окна?

    Хорошая STL-подобная библиотека для C

    Поиск всех символических и жестких ссылок на файл в UNIX

    jQuery ajax upload с индикатором выполнения – без вспышки

    Как мне заставить VLC играть на втором мониторе на окнах?

    Блокировать определенный URL-адрес в веб-браузерах

    System.BadImageFormatException: не удалось загрузить файл или сборку (из installutil.exe)

    Как загрузить Listview «плавно» в android

    Изменение шлюза по умолчанию в сети с окнами

    Я отменил резервирование Microsoft 10 и удалил KB3035583, но Window 10 все еще пытается установить

    AngularJS загружает несколько файлов с помощью API FormData

    Как связаны файлы «EFI system» и UEFI * .efi?

    Давайте будем гением компьютера.