c++ - try - todo numero dividido por 0 da 1
Algunas cosas sobre la divisiĆ³n por cero en C (4)
Posible duplicado:
Valor de retorno 1. # INF000
Siempre pensé que la división por 0 resultaría en un programa compilado fallando
Sin embargo, hoy descubrí (usando VC ++ 2010 Express) que la división por 0 da algo llamado 1. # INF000 y se supone que es infinito positivo
Cuando se pasó a una función, se pasó como -1. # IND000
¿Qué es todo esto?
Buscando 1. # INF000 y -1. # IND000 en google tampoco se ofrecen explicaciones claras
¿Es solo algo específico de VC ++?
Citando el último borrador de la norma ISO C ++, sección 5.6 ([expr.mul]):
Si el segundo operando de / o% es cero, el comportamiento no está definido.
Esto se aplica tanto a la división de enteros como a las de punto flotante.
Una implementación particular de C ++ puede ajustarse al estándar de punto flotante IEEE , que tiene requisitos más específicos para la división por cero, en cuyo caso el comportamiento puede estar bien definido para esa implementación . Probablemente, esa es la razón por la que la división de punto flotante por cero produce Infinity en su implementación. Pero el estándar de C ++ no requiere un comportamiento de punto flotante IEEE.
Edición: la pregunta es sobre C ++ y el resultado en C ++ no está definido, como lo establece claramente la norma , no el IEEE o cualquier otra entidad que, de hecho, no regule el lenguaje C ++. El estándar lo hace. Las implementaciones de C ++ pueden seguir las reglas de IEEE, pero en este caso está claro que el comportamiento no está definido.
Siempre pensé que la división por 0 resultaría en un programa compilado fallando
No, resulta en un comportamiento indefinido. Cualquier cosa puede pasar, un choque no está garantizado.
Según el estándar de C ++:
5.6 Operadores multiplicativos.
4) El operador binario produce el cociente, y el operador binario% produce el resto de la división de la primera expresión por la segunda. Si el segundo operando de / o% es cero, el comportamiento es indefinido ; de lo contrario (a / b) * b + a% b es igual a a. Si ambos operandos son no negativos, el resto es no negativo; si no, el signo del resto es definido por la implementación79). (énfasis mío)
La división de punto flotante por cero se comporta de manera diferente que la división de enteros por cero.
El estándar de punto flotante IEEE diferencia entre + inf y -inf, mientras que los enteros no pueden almacenar infinito. La división entera por cero da como resultado un comportamiento indefinido. La división de punto flotante por cero está definida por el estándar de punto flotante y da como resultado + inf o -inf.
Editar:
Como lo señaló Luchian, las implementaciones de C ++ no están obligadas a seguir el estándar de punto flotante IEEE. Si la implementación que utiliza no sigue el estándar de punto flotante IEEE, el resultado de la división de punto flotante por cero es indefinido.
puede usar el siguiente código sniplet en C. arroja la excepción. funciona en linux donno sobre ventanas aunque
#include <fenv.h>
#include <TRandom.h>
static void __attribute__ ((constructor)) trapfpe(void)
{
/* Enable some exceptions. At startup all exceptions are masked. */
feenableexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
}