trigonometricas - log2 no encontrado en mi math.h?
sqrt visual basic (5)
Estoy usando una instalación bastante nueva de Visual C ++ 2008 Express.
Estoy intentando compilar un programa que usa la función log2, que se encontró al incluir el uso de Eclipse en una Mac, pero esta computadora con Windows no puede encontrar la función (error C3861: ''log2'': identificador no encontrado).
La forma en que lo entendí, incluidos los directorios son específicos para el IDE, ¿verdad? math.h no está presente en mi directorio Microsoft SDKs / Windows / v6.0A / Include /, pero encontré un math.h en este directorio: Microsoft Visual Studio 9.0 / VC / include. También hay un cmath en ese directorio ...
¿Dónde está log2?
Con Visual Studio 2013, se agregó log2()
. Vea el soporte de la biblioteca C99 en Visual Studio 2013 .
Desde here :
Prototipo: log2 doble (doble número);
Archivo de encabezado: math.h (C) o cmath (C ++)
Alternativamente emúlalo como here
#include <math.h>
...
// Calculates log2 of number.
double Log2( double n )
{
// log(n)/log(2) is log2.
return log( n ) / log( 2 );
}
Desafortunadamente, Microsoft no lo proporciona .
Si está tratando de encontrar el log2
de estrictamente enteros, algunos bitwise no pueden dañar:
#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 ) ) ;
}
Tenga en cuenta que:
log2 (x) = log (x) * log (e)
donde log (e) es una constante. math.h
define M_LOG2E
como el valor de log(e)
si define _USE_MATH_DEFINES
antes de incluir 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;
}
Aunque el enfoque habitual es hacer log(n)/log(2)
, aconsejaría usar multiplicación, ya que la división siempre es más lenta, especialmente para flotantes y más en las CPU móviles. Por ejemplo, en las CPU modernas de Intel la diferencia en el código generado en una sola instrucción mulsd vs divsd y de acuerdo con los manuales de Intel, podríamos esperar que la división sea 5-10 veces más lenta. En la CPU móvil de ARM, esperaría que la división de coma flotante estuviera entre 10 y 100 veces más lenta que la multiplicación.
Además, en caso de que tengas problemas de compilación con log2
para Android, parece que log2 está disponible en encabezados a partir de android-18:
#include <android/api-level.h>
#if __ANDROID_API__ < 18
static inline double log2(double n)
{
return log(n) * M_LOG2E;
}
#endif
log2()
solo se define en el estándar C99, no en el estándar C90. Microsoft Visual C ++ no es totalmente compatible con C99 (diablos, no existe un único compilador totalmente compatible con C99, creo, ni siquiera GCC lo admite), por lo que no es necesario proporcionar log2()
.