¿Puede alguien explicarme cómo convierto un valor de coma flotante de 32 bits en un valor de coma flotante de 16 bits?Float32 to Float16
(s signo = e = exponente y mantisa m =)
Si 32 bits flotante es 1s7e24m
y el flotador 16 bits es 1s5e10m
entonces es tan simple como hacer?
int fltInt32;
short fltInt16;
memcpy(&fltInt32, &flt, sizeof(float));
fltInt16 = (fltInt32 & 0x00FFFFFF) >> 14;
fltInt16 |= ((fltInt32 & 0x7f000000) >> 26) << 10;
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Supongo que NO ES así de simple ... así que ¿alguien me puede decir lo que HAGA que hacer?
Editar: Puedo ver que tengo mi exponente desplazarse mal ... ¿así ESTO sería mejor?
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x7c000000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
Espero que esto sea correcto. Disculpas si me falta algo obvio que se ha dicho. Es casi medianoche un viernes por la noche ... así que no estoy "del todo" sobrio;)
Edit 2: Ooops. Lo fastidié de nuevo. ¡Quiero perder los 3 mejores bits, no los más bajos! Así que ¿qué tal esto:
fltInt16 = (fltInt32 & 0x007FFFFF) >> 13;
fltInt16 |= (fltInt32 & 0x0f800000) >> 13;
fltInt16 |= (fltInt32 & 0x80000000) >> 16;
código final debe ser:
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);
Creo que esto ya fue preguntado (y respondido) aquí: http://stackoverflow.com/questions/1659440/32-bit-to-16-bit-floating-point-conversion – humbagumba
podría ser así de simple, pero pierdes precisión a menos que float32 no use toda la "precisión" que tiene ... básicamente, obtienes 5/7 de los bits de exp (tomas por supuesto los más significativos), y 10/24 de la mantisa; estas proporciones dicen de alguna manera cuánto puede perder en la conversión. Exactamente como ocurre si quiere ajustar un entero de 32 bits en un entero de 16 bits ... el rango de números representables en la pantalla es más pequeño; "cortar" la mantisa reduce la "precisión", y el exponente también limita el rango: 5 bits firmados dan -16 a +15, contra -64/+ 63 (si lo hice bien ...: D tarde) – ShinTakezou
@ShinTakezou: ¿Seguro que no es posible perder 16 bits de datos y NO perder precisión? Float16 es mucho menos preciso y, por lo tanto, tiene menos precisión automáticamente ... ¿o no te estoy entendiendo bien? – Goz