Attualmente sto lavorando a un sistema di elaborazione numerica che verrà implementato in un ambiente critico per le prestazioni. Prende input sotto forma di array numerici (questi usano la libreria eigen
, ma ai fini di questa domanda che è forse irrilevante), ed esegue alcuni range di calcoli numerici (prodotti matrix, concatenazioni, ecc.) Per produrre output.
Tutti gli array sono allocati staticamente e le loro dimensioni sono note al momento della compilazione. Tuttavia, alcuni degli ingressi potrebbero essere non validi. In questi casi eccezionali , vogliamo comunque che il codice sia calcolato e vogliamo comunque che le uscite non "inquinate" vengano utilizzate da valori non validi.
Per fare un esempio, prendiamo il seguente esempio banale (questo è pseudo-codice):
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}
L'idea qui è che 2, 4 e 8 sono valori utilizzabili, ma la NAN dovrebbe segnalare al destinatario dei dati che quella voce era coinvolta in un'operazione che comportava un valore non valido, e dovrebbe essere scartata (questo sarà rilevato tramite un controllo std::isfinite(value)
prima che venga utilizzato il valore).
È un modo efficace di comunicare e propagare valori inutilizzabili, dato che le prestazioni sono critiche e l'allocazione dell'heap non è un'opzione (e nemmeno altri costrutti che consumano risorse come boost::optional
o puntatori)?
Ci sono modi migliori per farlo? A questo punto sono abbastanza soddisfatto dell'attuale configurazione, ma speravo di ottenere nuove idee o critiche produttive all'attuale implementazione.