Necesito una implementación muy rápida de la función log2 (float x) en C++.Implementación rápida de log2 (float x) C++
encontré una aplicación muy interesante (y muy rápido!)
#include <intrin.h>
inline unsigned long log2(int x)
{
unsigned long y;
_BitScanReverse(&y, x);
return y;
}
Pero esta función es bueno sólo para valores enteros de entrada.
Pregunta: ¿Hay alguna manera de convertir esta función para doble variable de entrada tipo?
UPD:
me encontré con esta implementación:
typedef unsigned long uint32;
typedef long int32;
static inline int32 ilog2(float x)
{
uint32 ix = (uint32&)x;
uint32 exp = (ix >> 23) & 0xFF;
int32 log2 = int32(exp) - 127;
return log2;
}
que es mucho más rápido que el ejemplo anterior, pero la salida es tipo sin signo.
¿Es posible hacer que esta función devuelva un tipo doble?
¡Gracias de antemano!
Este es un requisito muy extraño, porque Logaritmo con base 2 rara vez se utiliza para nada más que el cálculo de número de bits por algo y trabajas con enteros cuando cuentas los bits. Entonces, ¿para qué lo necesitas? –
@JanHudec: Fuera de mi cabeza, dos usos comunes de un logaritmo serían calcular la entropía de una señal y hacer aritmética en números muy grandes que de otro modo se desbordarían. –
@MikeSeymour: para la señal, es raro que sea un punto flotante en lugar de un número entero. Para la aritmética en números grandes, no necesitaría la base 2 y probablemente usaría un logaritmo natural ya que las matemáticas usualmente se expresan con eso. –