¿Por qué la división de enteros por cero da como resultado una excepción de punto flotante?

3 minutos de lectura

La división por cero en un programa C da como resultado una terminación anormal con el mensaje de error Floating point exception (core dumped). Esto no es sorprendente para la división de punto flotante, pero ¿por qué dice esto cuando ocurre la división de enteros por cero? ¿La división de enteros realmente usa la FPU debajo del capó?

(Todo esto es en Linux bajo x86, por cierto).

  • Vale la pena señalar que otros sistemas operativos que no son POSIX (p. ej., Windows) y el hardware x86 notifican diferentes excepciones para la división de números enteros y coma flotante por cero.

    – Crashworks

    3 de junio de 2016 a las 0:41

  • Relacionado: ¿En qué plataformas la división de enteros por cero desencadena una excepción de punto flotante? TL: DR: POSIX requiere que sea SIGFPE si hay una señal.

    – Peter Cordes

    23 de septiembre de 2017 a las 12:17

avatar de usuario
Oliver Charlesworth

¿La división de enteros realmente usa la FPU debajo del capó?

No, Linux solo genera SIGFPE en este caso también (es un nombre heredado cuyo uso ahora se ha extendido). De hecho, la especificación única de Unix define el SIGFPE como “Operación aritmética errónea“.

man signal menciona:

La división de enteros por cero tiene un resultado indefinido. En algunas arquitecturas generará una señal SIGFPE. (También dividir el entero más negativo por -1 puede generar SIGFPE).

Supongo que una explicación histórica para esto sería que el hardware original de Unix no generó una trampa en la división de enteros por cero, por lo que el nombre SIGFPE Tuvo sentido. (Programadores de ensamblaje de PDP, ¿lo confirman?) Luego, cuando el sistema fue portado (o en el caso de Linux, reimplementado) a hardware con una trampa de división por cero de enteros, no se consideró que valiera la pena agregar un nuevo número de señal, por lo que el antiguo adquirió un nuevo significado y ahora tiene un nombre un poco confuso.

  • Parece que tienes razón: según esta referencia, DIV la instrucción simplemente establece C y V banderas en la división por cero, y V bandera solo si el resultado no cabe en el registro de destino. OTO, según esta página FP11, la FPU más nueva del PDP-11, admitió la captura. Entonces, de hecho, inicialmente no había necesidad de un nombre de señal de error de división de enteros.

    – Ruslán

    30 de marzo de 2018 a las 21:22


Podría haber muchas razones específicas de implementación diferentes para eso.

Por ejemplo, la unidad FPU en la plataforma x86 admite formatos de coma flotante y enteros para leer argumentos y escribir resultados. Antes, cuando la plataforma en sí era de 16 bits, algunos compiladores usaban la FPU para realizar divisiones con operandos enteros de 32 bits (ya que no hay pérdida de precisión para datos de 32 bits de ancho). En tales circunstancias, no sería nada inusual obtener un error FPU genuino por una división de enteros de 32 bits no válida.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad