Este artículo explora el comportamiento de las funciones de redondeo de punto flotante floor, ceil, trunc y round, centrándose en un caso específico: floor(-1.175493930432748e-38), un número desnormalizado. Explica que los desnormales (subnormales) pueden ser preservados o eliminados a cero dependiendo de la plataforma (CPU, GPU, flags del compilador). Esta diferencia conduce a resultados dramáticamente diferentes: cuando los desnormales son preservados, floor devuelve -1.0; cuando son eliminados, devuelve -0.0. El autor prueba varias configuraciones de CPU (flags de compilación de Visual Studio, SSE2/AVX2) y encuentra una preservación consistente. Las pruebas de GPU muestran que las GPU Nvidia eliminan los desnormales a cero, mientras que Intel y AMD los preservan (aunque el comportamiento de AMD cambió con las actualizaciones del controlador). El artículo señala que la especificación de DirectX realmente requiere la eliminación a cero en las GPU. Proporciona código HLSL personalizado para floor/ceil determinista que siempre preserva los desnormales, utilizando la manipulación de bits para detectar desnormales negativos/positivos y devolver el entero correcto. La idea central es que el manejo de desnormales puede causar no determinismo entre CPU y GPU, y los desarrolladores deben ser conscientes de esto al usar funciones de redondeo en números muy pequeños.
El Dilema de la Desnormalización: Por qué floor() en un Número Muy Pequeño Puede Devolver -1.0 o -0.0
