Casi cualquier operación de coma flotante o función de biblioteca matemática que produce un NaN de entradas que no sean NaN también debe señalar la excepción de coma flotante 'operación no válida'; de forma similar, un cálculo que produce un infinito a partir de entradas finitas normalmente indicará la excepción de punto flotante 'dividir por cero' o 'desbordamiento'. Entonces quieres alguna manera de convertir estas excepciones en un SIGFPE.
Sospecho que la respuesta dependerá en gran medida del sistema, ya que el control de las trampas de coma flotante y las banderas es probable que sea suministrado por la biblioteca de la plataforma C en lugar de por la propia gcc. Pero aquí hay un ejemplo que funciona para mí, en Linux. Utiliza la función feenableexcept
de fenv.h
. La definición _GNU_SOURCE
es necesaria para declarar esta función.
#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;
}
Una advertencia: Creo que es posible con algunas configuraciones que en realidad no es la excepción generada hasta que la operación de punto flotante siguiente después del que (en teoría) debería haber causado, por lo que a veces necesita una operación de coma flotante no operativa (por ejemplo, multiplicando por 1.0) para activar la excepción.
'-fsignaling-nans' es el tiempo de ejecución, no en tiempo de compilación. – LiraNuna
¿En qué sistema estás? –