Cuando ejecuto el siguiente código C en una máquina Intel ...Coaccionar flotador en unsigned char en ARM vs Intel
float f = -512;
unsigned char c;
while (f < 513)
{
c = f;
printf("%f -> %d\n", f, c);
f += 64;
}
... la salida es la siguiente:
-512.000000 -> 0
-448.000000 -> 64
-384.000000 -> 128
-320.000000 -> 192
-256.000000 -> 0
-192.000000 -> 64
-128.000000 -> 128
-64.000000 -> 192
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0
Sin embargo, cuando ejecuto el mismo código en un dispositivo ARM (en mi caso un iPad), los resultados son bastante diferentes:
-512.000000 -> 0
-448.000000 -> 0
-384.000000 -> 0
-320.000000 -> 0
-256.000000 -> 0
-192.000000 -> 0
-128.000000 -> 0
-64.000000 -> 0
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0
Como se puede imaginar, esto tipo de diferencia puede introducir horribles errores en proyectos multiplataforma. Mis preguntas son:
que estaba equivocado suponer que coaccionar a un flotador en un unsigned char produciría los mismos resultados en todas las plataformas?
¿Podría ser un problema de compilación?
¿Hay una solución elegante?
No estoy muy bien informado sobre esto, pero mi primera reacción es que es una mala idea tratar de forzar un flotador en un char sin signo en cualquier plataforma en cualquier arquitectura. –
No estoy de acuerdo contigo, Brian. La precisión no es un problema aquí, pero el rendimiento sí lo es. Estoy usando la naturaleza de "envoltura" del carácter sin signo para mantenerme dentro de los límites de 0 a 255. Esto es, AFAIK (y he leído en varios artículos) no es una técnica poco común. – zmippie
@Zmippie: el comportamiento que está viendo es la naturaleza de "saturación", que es bastante común en, por ejemplo, Conjuntos de instrucciones SIMD. – rwong