2009-07-04 18 views
22

Hoy estaba rastreando una excepción de punto flotante en algún código que acababa de escribir. Me tomó un poco de tiempo encontrarlo porque en realidad fue causado por tomar un cero de mod entero. Obviamente, hacer algo mod cero no va a ser definido, pero pensé que era extraño que el error fuera tan engañoso. ¿Qué hay dentro del operador del módulo de C++ que usaría el punto flotante para dos enteros? (Estoy usando gcc 4.3.2)¿Por qué un% b produce SIGFPE cuando b es cero?

Aquí hay un programa simple para demostrar el error.

int main() 
{ 
    int a=3,b=0; 
    int c=a%b; 
    return 0; 
} 

Respuesta

33

La operación desencadena SIGFPE:

SIG es un prefijo común para la señal nombres; FPE es un acrónimo para la excepción de coma flotante . Aunque SIGFPE no implica necesariamente la aritmética de punto flotante , no hay forma de cambiar su nombre sin rompiendo la compatibilidad con versiones anteriores.

GDB es un poco más claro acerca de esto y lo llama "excepción aritmética":

(gdb) run 
Starting program: /home/emil/float 

Program received signal SIGFPE, Arithmetic exception. 
0x0804837d in main() at float.c:4 
4   int c=a%b; 
9

Eche un vistazo a this page.

Parte pertinente de tu pregunta:

SIG es un prefijo común para los nombres de las señales; FPE es un acrónimo de excepción de coma flotante. Aunque SIGFPE no implica necesariamente una aritmética de punto flotante, no hay forma de cambiar su nombre sin romper la compatibilidad con versiones anteriores.

Cuestiones relacionadas