Quasi tutte le operazioni in virgola mobile o la funzione di libreria matematica che produce un NaN da ingressi non NaN devono anche segnalare l'eccezione a virgola mobile "operazione non valida"; analogamente, un calcolo che produce un infinito dagli input finiti di solito segnalerà l'eccezione a virgola mobile "divide per zero" o "overflow". Quindi vuoi un modo per trasformare queste eccezioni in un SIGFPE.
Sospetto che la risposta sia altamente dipendente dal sistema, dal momento che il controllo delle trappole e dei flag in virgola mobile viene probabilmente fornito dalla libreria della piattaforma C anziché da gcc. Ma ecco un esempio che funziona per me, su Linux. Utilizza la funzione feenableexcept
da fenv.h
. La definizione _GNU_SOURCE
è necessaria per dichiarare questa funzione.
#define _GNU_SOURCE
#include <fenv.h>
int main(void) {
double x, y, z;
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
x = 1e300;
y = 1e300;
z = x * y; /* should cause an FPE */
return 0;
}
Un avvertimento: Penso che sia possibile con alcune impostazioni che l'eccezione non viene effettivamente generato fino a quando l'operazione in virgola mobile prossimo dopo quello che (in teoria) dovrebbe averlo causato, in modo a volte è necessario un funzionamento in virgola mobile non operativo (ad esempio moltiplicando per 1,0) per attivare l'eccezione.
fonte
2010-06-01 11:49:33
'-fsignaling-nans' è tempo di esecuzione, non è tempo di compilazione. – LiraNuna
Che sistema stai? –