La siguiente función C es del proyecto fastapprox .
static inline float fasterlog2 (float x) { union { float f; uint32_t i; } vx = { x }; float y = vx.i; y *= 1.1920928955078125e-7f; return y - 126.94269504f; }¿Podrían algunos expertos explicar por qué el sesgo del exponente utilizado en el código anterior es 126,94269504 en lugar de 127? ¿Es el valor de sesgo más preciso?
En el proyecto que vinculó, incluyeron un cuaderno de Mathematica con una explicación de sus algoritmos, que incluye el valor "misterioso" -126.94269 .
Si necesita un visor, puede obtener uno del sitio web de Mathematica de forma gratuita.
Editar: como me siento generoso, aquí está la sección relevante en forma de captura de pantalla .
En pocas palabras, explican que el valor es "más simple, más rápido y menos preciso".
No están usando -126.94269 en lugar de -127 , lo están usando en lugar del resultado del siguiente cálculo (valores redondeados por brevedad):
-124.2255 - 1.498 * mx - (1.72588 / (0.35201 + mx))Bueno, no, 126.94269504 no es un valor de sesgo "más preciso". Este código está haciendo algo muy, muy extraño; Estoy bastante sorprendido de que funcione en absoluto. Toma los bits de un flotante como si fueran un int (que en mi experiencia generalmente le da un valor totalmente basura, pero tal vez no), luego toma ese valor int "basura" y lo convierte de nuevo en un flotante, luego hace algo matemáticas en eso. Esta es, como dicen, una forma rápida y aproximada de hacer algo, en este caso, tomando el logaritmo en base 2. No debería funcionar en absoluto, pero la diferencia entre 127 y 126.94269504 es evidentemente solo uno de los varios factores tontos que pretenden salvar algo de significado de lo que debería ser un código sin sentido. (Algo así como "dos casi errores hacen uno casi correcto").
Si desea extraer exactamente la mantisa y el exponente de un flotante (aunque esto no será tan rápido ni tan aproximado), la forma habitual de hacerlo es con la función frexpf .