Actualmente estoy trabajando en un sistema de procesamiento numérico que se implementará en un entorno de rendimiento crítico. Toma entradas en forma de matrices numéricas (estas usan la eigen
biblioteca, pero para el propósito de esta pregunta que tal vez sea irrelevante), y realiza un rango de cálculos numéricos (productos de matriz, concatenaciones, etc.) para producir salidas.
Todos los arreglos se asignan estáticamente y sus tamaños se conocen en tiempo de compilación. Sin embargo, algunas de las entradas pueden ser inválidas. En estos casos excepcionales , todavía queremos que se calcule el código y aún queremos que se utilicen salidas no "contaminadas" por valores no válidos.
Para dar un ejemplo, tomemos el siguiente ejemplo trivial (este es un pseudocódigo):
Matrix a = {1, 2, NAN, 4}; // this is the "input" matrix
Scalar b = 2;
Matrix output = b * a; // this results in {2, 4, NAN, 8}
La idea aquí es que 2, 4 y 8 son valores utilizables, pero la NAN debe indicar al destinatario de los datos que esa entrada estuvo involucrada en una operación que involucró un valor no válido, y debería descartarse (esto se detectará a través de un std::isfinite(value)
verificar antes de usar el valor).
¿Es esta una forma sólida de comunicar y propagar valores inutilizables, dado que el rendimiento es crítico y la asignación de almacenamiento dinámico no es una opción (y tampoco lo son otras construcciones que consumen recursos como boost::optional
punteros)?
¿Hay mejores formas de hacer esto? En este punto, estoy bastante contento con la configuración actual, pero esperaba obtener algunas ideas nuevas o críticas productivas de la implementación actual.