Die Division durch null nicht werfen SIGFPE
Habe ich ein kleines Programm durchführen Fließkomma-division durch null, also erwarte ich SIGFPE.
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void signal_handler (int signo) {
if(signo == SIGFPE) {
std::cout << "Caught FPE\n";
}
}
int main (void) {
signal(SIGFPE,(*signal_handler));
double b = 1.0;
double c = 0.0;
double d = b/c;
std::cout << "d = "<< d << std::endl;
return 0;
}
Eigentlich bekam ich die folgende Ausgabe:
d = inf
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
Was soll ich tun, zu werfen SIGFPE in diesem Fall? Die Faktoren FP operation Verhalten abhängen (compiler flags/CPU-Typ und so weiter)?
Dank
- Dieser sollte ziemlich standarrd, wenn Sie die IEEE-floats.
- Ähnliche Frage: Kann ich gcc sagen Sie mir, wenn eine Berechnung zum Ergebnis NaN oder inf zur Laufzeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für floating-point-numbers) Sie können dieses Verhalten ändern, indem Sie die Einrichtung FPU control word". Werfen Sie einen Blick hier
<fenv.h>
definiertfesettrapenable
. Dies ist nicht standard, sondern ist weit verbreitet. Auf linux, verwenden Siefeenableexcept
-- aber Sie müssen#define _GNU_SOURCE
bevor Sie#include <fenv.h>
.fpu_control.h
ist ", fehlt auf alle nicht-glibc-Plattformen: MacOS X 10.5, FreeBSD 6.0, NetBSD 5.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 11 2010-11, Cygwin, mingw, Interix-3.5, BeOS"Du nur ein signal bekommen, wenn man eine integer-division durch null. Für floating-point-zahlen division durch null ist gut definiert.
Dies ist eigentlich erklärt ziemlich gut in der Wikipedia-Artikel.
Du nicht ein signal bekommen, weil die Standard-Verhalten in den meisten Maschinen zu verschmutzen Ihren Daten mit NaN (keine Zahl) und unendlichen. Sie haben zum aktivieren der floating-point-exceptions, und was Sie dafür tun müssen, ist computerspezifisch. Blick auf die system-header
fenv.h
, wenn Sie eine haben. Die Funktionfesettrapenable
ermöglicht den Fang von unverankerten Punkt Ausnahmen auf vielen Maschinen.Leider gibt es keine standard-Funktion schalten floating-point-exceptions-handling auf.