Cuanto a la división por cero, las normas dicen:

C99 6.5.5p5 – El resultado de la /operador es el cociente de la división del primer operando por el segundo; el resultado del operador % es el resto. En ambas operaciones, si el valor del segundo operando es cero, el comportamiento es indefinido.

C++03 5.6.4 – El binario /operador se obtiene el cociente, y el binario operador % de los rendimientos que 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.

Si cogemos los párrafos anteriores a su valor nominal, la respuesta es claramente un Comportamiento Indefinido para ambos idiomas. Sin embargo, si miramos más abajo en el estándar C99 vemos el siguiente párrafo, que parece ser contradictorio(1):

C99 7.12p4 – El INFINITO macro se expande a una expresión de la constante de tipo float que representa positiva o infinito sin signo, si está disponible;

Hacer las normas que tienen algún tipo de regla de oro donde Comportamiento Indefinido no puede ser sustituida por una (potencialmente) declaración contradictoria? Aparte de eso, creo que no es irrazonable concluir que si su implementación se define el INFINITO macro, la división por cero se define como tal. Sin embargo, si su aplicación no no definir una macro, el comportamiento es Indefinido.

Tengo curiosidad por lo que el consenso es (si alguna) en esta materia para cada uno de los dos idiomas. Sería la respuesta cambio si estamos hablando de la división de enteros int i = 1 /0 frente a la división de punto flotante float i = 1.0 /0.0 ?

Nota (1) El C++03 norma habla sobre la <cmath> biblioteca que incluye el INFINITO macro.

  • Aquí es otro conocido chiste: Si x * 0 = y, a continuación, cómo encontrar x ?
  • ¿cómo se han cancelado y/(xy) ? Usted debe obtener 1/x, pero no x
  • yo diría que x * 0 = y, encontrar x sería el matemático equivalente de una pregunta retórica. x es cualquier cosa o nada, y por lo tanto no tiene respuesta mientras no requiere una respuesta de la misma.
  • Si se divide por x tiene que asumir x != 0 así.
  • «Yo no creo que sea razonable a la conclusión de que si su implementación se define el INFINITO macro, la división por cero se define como tal»: de hecho esta es irrazonable, como C99 7.12p4 no se menciona la división. De todos modos, la asignación de INFINITO no es incompatible con la UB.
  • He votado a favor, porque de ninguna manera veo la segunda cita lo que implica que el INFINITO es el resultado de una división por cero, así que la pregunta es, en mi opinión, mal planteado.
  • Relacionados con la El comportamiento de la división de punto flotante por cero
  • Anotado y registrado como tal. Buen día señor!
  • He añadido una nueva respuesta a la pregunta de @Antonio referencias y tiene un montón más de detalles.

InformationsquelleAutor SiegeX | 2010-06-09

8 Comentarios

  1. 25

    Yo no veo ninguna contradicción. La división por cero no está definido, período. No hay ninguna mención de «… a menos que el INFINITO se define» en cualquier lugar del texto citado.

    Nota que en ninguna parte en matemáticas se define que 1 /0 = el infinito. Uno podría interpretar de esa manera, pero es personal, «acceso directo» estilo de interpretación, en lugar de un sonido hecho.

    • De acuerdo. 1 / 0; y expresiones similares en ninguna manera implican la macro INFINITY (a menos que por casualidad la aplicación elige voluntariamente a utilizar para resolver el comportamiento indefinido).
    • respecto a su comentario entre paréntesis: mi hallazgos muestran que, de hecho esta es la forma en que muchos (la mayoría?) implementaciones de elegir a resolver esto. Por no decir que hace es definido por la implementación de comportamiento, pero no agregar a la confusión.
    • No con GCC y amigos. Corrí #include <math.h> int div_0_i = 1 / 0; float div_0_f = 1.0f / 0.0f; float my_inf = INFINITY; a través de GNU cpp, y consiguió int div_0_i = 1 / 0; float div_0_f = 1.0f / 0.0f; float my_inf = (__builtin_inff());, Así que no veo una conexión.
    • Al parecer, gcc no es lo suficientemente inteligente como para reemplazar div cero en el pre-procesador de tiempo, pero compilar y ejecutar este código y verás a lo que me refiero. –> #include <math.h> float f = 1.0f / 0.0f; if(f == INFINITY) puts("f == INFINITY");
    • tenga en cuenta que – como @Kenny, señaló en su respuesta, que puede ser utilizada como una señal de «desbordamiento», también conocido como «valor no válido», no en el cálculo del resultado por sí mismo.
    • así, en matemáticas ¿cuál es la respuesta a 1/0 ?
    • Wow… Qué las matemáticas tienen que ver con la definición del lenguaje? Lo que sucede a das computar cuando das programa sez int x = 1 / 0;? ¿El equipo de selección daises? O (como en casi todas las plataformas que he escuchado de) hacemos chocar y quemar realmente duro? La respuesta a what is 1 / 0? puede ser indefinido, pero anormales de terminación del programa y excepción no son indefinidos. Es el estándar de veras aún esta floja?
    • No sólo son los estándares son también sumamente flojo, pero la interpretación se ha vuelto más flexibles que en los últimos años. Solía ser que en los casos donde una plataforma natural, exhiben un comportamiento determinado en los casos en que no obligados por la norma, los compiladores podría permitir a los programadores a hacer uso de ella. Hiper-moderno compilador de la filosofía, sin embargo, sugiere que cuando se administra un programa que requieren de tales características para satisfacer los requisitos cuando se dan ciertos datos de entrada, es mejor para un compilador para producir un pequeño ejecutable que cumplir con el estándar de C en todos los casos se especifica lo que…
    • …que un mayor ejecutable que satisfagan los requisitos, incluso en los casos en que no obligados por el C estándar.
    • en Matemáticas todo depende de lo que usted llame a dividir, y lo que usted llame a cero.

  2. 11

    1 /0 no es infinito, sólo

    lim 1/x = ∞ (x -> +0)

    • esta respuesta no es de programación relacionados.
    • … es perfectamente válida la respuesta dada a la pregunta.
    • Esto es incorrecto, es cierto sólo si x está limitado a valores positivos.
    • tienes razón, debería haber puesto allí |lim 1/x|, pero el punto es que todavía no hay de que 🙂
    • Alexander la pregunta es «División por cero: un Comportamiento Indefinido o Definido por la Implementación en C y/o C++ ?», no se si el comportamiento en las normas de acuerdo con el concepto de la matemática. La norma utiliza HUGE_VAL de tales límites, que es el mismo patrón de bits como infinito en IEE745 implementaciones.
    • Kirkham: Bueno, no era el estándar que responde a la pregunta, y a otro nivel, que no era contradictoria con la primera y la contradicción sólo fue asumido por el mal matemática de la presunción, por lo que en mi opinión negarse esta suposición hace que la respuesta clara.
    • No hay representación exacta de cero en la mayoría de los de punto flotante de implementaciones. Al menos en el IEE fp, hay tanto +0.0, y -0.0 que representan el rango de tamaño de exacta cero a la mitad del mínimo representable valor – todos los bits son cero, o todos los ceros con el bit de signo conjunto. No pienses que 0.0 en C significa exacto cero en matemáticas, o que las matemáticas prescribe su comportamiento. Trate de añadir uno a INT_MAX y ver si la interpretación de los símbolos como si las matemáticas trabajó da el comportamiento correcto.
    • El punto es que usted debe responder a preguntas basadas en normas con referencia a las normas, no con referencia a cómo deben funcionar las cosas si los símbolos en el código se interpreta en un entorno diferente. No es más correcto decir 1.0/0.0 no está definido en matemáticas, de modo que no se ha definido en C99 que es decir de la basura es recogida de los jueves en mi calle, por lo que la basura se recoge sólo los jueves en Java.
    • Sí, probablemente debería dijo lo que usted dice – que el autor de la pregunta no debería desajuste de las matemáticas a las normas, pero, de nuevo, el autor hizo y basado en lo que él pensaba que las normas son contradictorias, lo cual no es cierto. También, hay un montón de situaciones en las que las matemáticas son aplicables (incluyendo esta).
    • Creo que la solución puede ser tan simple como cambiar (ten en cuenta que el signo más), «x -> 0+». El valor absoluto de una cantidad que no existe, no tiene mucho sentido. Más bien, desea utilizar la definición de la notación que le da un valor definido (donde +infinito se ha definido).
    • Kirkham «El punto es que usted debe responder a preguntas basadas en normas con referencia a las normas, no con referencia a cómo deben funcionar las cosas si los símbolos en el código se interpreta en un ambiente diferente.» Que es lo que estaba pensando; sin embargo, el estándar decir «El resultado de la / operador es el cociente de la división del primer operando por el segundo». Por lo tanto C99, en ausencia de una lista de excepciones o aclaración/redefiniciones no invocar la costumbre de significados en las matemáticas como la correcta C99 comportamiento.
    • En un espacio proyectivo y en la esfera de Riemann 1/0 y el límite de ambos están muy bien definidos.

  3. 4

    ¿Por qué?

    Que no tiene sentido matemáticamente, no es como si 1/x se define como ∞ en matemáticas en general. También, que al menos se necesitan dos casos más: -1/x y 0/x no puede también igual ∞.

    Ver la división por cero en general, y la sección sobre equipo de la aritmética en particular.

    • Yo afirmaría que y = 1/x no igual a ∞ cuando x –> 0
    • Este es un muy común error (supongo que la gente que en realidad nunca tuvo un cálculo formal del curso son más propensos a hacerlo.) SiegeX, C/C++ no tiene el concepto de «-->«
    • estás diciendo que el lim [x --> +0] f(y) != ∞ donde f(y) = 1/x ?
    • claro que sí, no has visto esto ASÍ, pregunta stackoverflow.com/questions/1642028/…? =P
    • Yo afirmaría que la división por cero no está definida en la asignatura de matemáticas.y = 1/x tiende a infinito si x es positivo y tiende a 0. Sin embargo, tiende a -infinito si x es negativo y tiende a 0. ¿Cuál elegir? La respuesta no es ni debido a que la división se define matemáticamente en términos de multiplicación, es decir, d = p/q, se define como el número que multiplicado por q da p y no el número de veces 0 puede dar cualquier cosa, sino 0.
  4. 4

    Esto no fue una matemática más pura cuestión, pero un C/C++ pregunta.

    • Según el Estándar IEEE 754, que todos los modernos compiladores de C /FPU del uso, tenemos
      • 3.0 /0.0 = INF
      • 0.0 /0.0 = NaN
      • -3.0 /0.0 = -INF

    La FPU se tiene un indicador de estado, que puede configurar para generar una excepción, si así lo desea, pero esto no es la norma.

    INF puede ser muy útil para evitar la ramificación cuando INF es un resultado útil. Véase la discusión aquí

    http://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF

  5. 1

    Solo tengo la C99 proyecto. En el artículo 7.12/4 dice:

    La macro

        INFINITY

    se expande a una expresión de la constante de
    tipo float representación positiva o
    infinito sin signo, si está disponible; de lo contrario,
    para una constante positiva de tipo float
    que se desborda en tiempo de traducción.

    Nota que INFINITY puede ser definido en términos de punto flotante de desbordamiento, no necesariamente de división por cero.

  6. 1

    Para el INFINITO macro: hay una explícita de codificación para representar a +/- infinito en el estándar IEEE754, que es cuando todos los bits de exponente de conjunto y todos fracción bits se borran (si una fracción bit está establecido, representa NaN)

    Con el compilador, (int) INFINITY == -2147483648, por lo que una expresión que se evalúa a int i = 1/0 definitivamente producir resultados falsos si INFINITIY fue devuelto

  7. 1

    Implementaciones que definir __STDC_IEC_559__ están obligados a cumplir con los requisitos que figuran en el Anexo F, que a su vez requiere de punto flotante semántica coherente con la norma CEI 60559. La Norma no impone requisitos sobre el comportamiento de punto flotante de la división por cero sobre las implementaciones que no definen __STDC_IEC_559__, pero no para aquellos que lo definen. En los casos donde IEC 60559 especifica un comportamiento, sino que el Estándar de C no, un compilador que define __STDC_IEC_559__ es requerido por el Estándar de C a comportarse tal como se describe en la norma IEC.

    Como se define en la norma IEC 60559 (o del estándar IEEE-754) de la División de cero por cero rendimientos NaN, de la división de un número de punto flotante por positiva, cero o literal constante cero, se obtiene un valor INF con el mismo signo que el dividendo, y la división de un número de punto flotante negativa y cero, se obtiene un INF con el signo opuesto.

  8. 0

    Línea de fondo, C99 (como por sus cotizaciones) no dice nada sobre el INFINITO en el contexto de la implementación de la «definido». En segundo lugar, lo que se cita no se muestran inconsistentes significado de «un comportamiento indefinido».


    [Citando a Wikipedia, un Comportamiento Indefinido página] «En C y C++, la aplicación definida por el comportamiento también se utiliza, en donde la lengua estándar no especifica el comportamiento, pero la aplicación debe elegir un comportamiento y las necesidades del documento y observar las normas que se eligió.»

    Más precisamente, la norma significa «la aplicación definida» (creo que la única) cuando se utiliza esas palabras con respecto a la declaración hecha desde la implementación de la «definido» es un atributo específico de la norma. La cita de C99 7.12p4 no mencionar la implementación de la «definido».

    [De C99 sexual (finales del proyecto)] «undefined comportamiento: el comportamiento, sobre el uso de no portátiles o errónea programa de construcción o de datos erróneos, por lo que esta Norma Internacional no impone requisitos de»

    Nota «no hay ninguna exigencia impuesta por un comportamiento indefinido!

    [C99 ..] «la aplicación definida por el comportamiento: sin especificar el comportamiento que cada implementación de los documentos de cómo se realiza la elección»

    [C99 ..] «sin especificar el comportamiento: uso de un sin especificar valor, u otro comportamiento donde esta Norma Internacional proporciona dos o más posibilidades y no impone requisitos adicionales en que es elegido en cualquier instancia»

    Documentación es un requisito para la implementación de comportamiento definido.

    • Si una aplicación se define __STDC_IEC_559__, debe implementar la división por cero semántica consistente con el estándar aunque el C Estándar no de otra manera imponer cualquiera de los requisitos de comportamiento.

Dejar respuesta

Please enter your comment!
Please enter your name here