Rompere su NaNs o infs
-
05-07-2019 - |
Domanda
Spesso è difficile trovare l'origine di una NaN, poiché può accadere in qualsiasi fase di un calcolo e propagarsi. Quindi è possibile arrestare un programma C ++ quando un calcolo restituisce NaN o inf? La migliore secondo me sarebbe quella di avere un crash con un bel messaggio di errore:
Foo: NaN encoutered at Foo.c:624
È possibile qualcosa del genere? hai una soluzione migliore? Come si esegue il debug dei problemi NaN?
EDIT: precauzioni: sto lavorando con GCC su Linux.
Soluzione
Non puoi farlo in un modo completamente portatile, ma molte piattaforme forniscono API C che ti consentono di accedere ai registri di controllo dello stato in virgola mobile.
In particolare, si desidera smascherare l'overflow e le eccezioni non valide in virgola mobile, che causeranno al processore la segnalazione di un'eccezione quando l'aritmetica nel programma produce un risultato NaN o infinito.
Sul tuo sistema Linux questo dovrebbe fare il trucco:
#include <fenv.h>
...
feenableexcept(FE_INVALID | FE_OVERFLOW);
Potresti voler imparare a scrivere un gestore trap in modo da poter stampare un messaggio diagnostico o continuare comunque l'esecuzione quando viene segnalata una di queste eccezioni.
Altri suggerimenti
Sì! Imposta (forse più o meno portabilmente) il tuo processore conforme a IEEE 754 per generare un interrupt quando si incontra un NaN o un infinito.
Ho cercato su Google e ho trovato queste diapositive , che sono un inizio. La diapositiva a pagina 5 riepiloga tutte le informazioni necessarie.
Non sono un esperto C, ma mi aspetto che la risposta sia no.
- Ciò richiederebbe che ogni calcolo float abbia questo controllo. Un enorme impatto sulle prestazioni.
- NaN e Inf non sono cattivi. Possono essere legittimamente utilizzati in alcune librerie utilizzate dalla tua app e romperle.