El Dilema de la Desnormalización: Por qué floor() en un Número Muy Pequeño Puede Devolver -1.0 o -0.0

Fuentes: The Denormal Dilemma: Why floor() on a Tiny Number Can Return -1.0 or -0.0
Imagen generada por IA con el prompt: Split-screen visualization: left side shows a number line near zero with tiny denormal points preserved, right side shows them flushed to zero; geometric style, blue and red color contrast, no text or logos.
Imagen generada con IA

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.