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.

È stato utile?

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.

  1. Ciò richiederebbe che ogni calcolo float abbia questo controllo. Un enorme impatto sulle prestazioni.
  2. NaN e Inf non sono cattivi. Possono essere legittimamente utilizzati in alcune librerie utilizzate dalla tua app e romperle.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top