Estoy obteniendo un valor de un registro (SRCx_RATIO) de un DSP SHARC, la hoja de datos dice:
Estoy usando el siguiente código para convertir el valor:
// Convert the sample rate ratio to a float from 4.11 format.
int_part = (((src_reg >> 14) & BIT_0) * TWO_POW_3) +
(((src_reg >> 13) & BIT_0) * TWO_POW_2) +
(((src_reg >> 12) & BIT_0) * TWO_POW_1) +
(((src_reg >> 11) & BIT_0) * TWO_POW_0);
frac_part = (((src_reg >> 10) & BIT_0) * TWO_POW_MINUS1) +
(((src_reg >> 9) & BIT_0) * TWO_POW_MINUS2) +
(((src_reg >> 8) & BIT_0) * TWO_POW_MINUS3) +
(((src_reg >> 7) & BIT_0) * TWO_POW_MINUS4) +
(((src_reg >> 6) & BIT_0) * TWO_POW_MINUS5) +
(((src_reg >> 5) & BIT_0) * TWO_POW_MINUS6) +
(((src_reg >> 4) & BIT_0) * TWO_POW_MINUS7) +
(((src_reg >> 3) & BIT_0) * TWO_POW_MINUS8) +
(((src_reg >> 2) & BIT_0) * TWO_POW_MINUS9) +
(((src_reg >> 1) & BIT_0) * TWO_POW_MINUS10) +
((src_reg & BIT_0) * TWO_POW_MINUS11);
// Return the value to be used.
*ratio = (int_part + frac_part);
Las definiciones son:
// Power of 2 converstion used with 4.11 to float conversion.
#define TWO_POW_0 1.0F // (2^0)
#define TWO_POW_1 2.0F // (2^1)
#define TWO_POW_2 4.0F // (2^2)
#define TWO_POW_3 8.0F // (2^3)
#define TWO_POW_MINUS1 0.5F // (2^-1)
#define TWO_POW_MINUS2 0.25F // (2^-2)
#define TWO_POW_MINUS3 0.125F // (2^-3)
#define TWO_POW_MINUS4 0.0625F // (2^-4)
#define TWO_POW_MINUS5 0.03125 // (2^-5)
#define TWO_POW_MINUS6 0.015625F // (2^-6)
#define TWO_POW_MINUS7 0.0078125F // (2^-7)
#define TWO_POW_MINUS8 0.00390625F // (2^-8)
#define TWO_POW_MINUS9 0.001953125F // (2^-9)
#define TWO_POW_MINUS10 0.000976563F // (2^-10)
#define TWO_POW_MINUS11 0.000488281F // (2^-11)
#define BIT_0 (1 << 0)
¿Alguien sabe una mejor manera de obtener este valor?