Ir al contenido



Foto

Division cero


  • Por favor identifícate para responder
3 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.922 mensajes
  • LocationMéxico

Escrito 26 marzo 2019 - 11:24

Haciendo unos ejercicio acerca del manejo de excepciones me encontré con un caso que me parece interesante.
 
Cuando hago ésto
 
 

delphi
  1.   try
  2.      X := 100/0;
  3.   except
  4.      on EZeroDivide do
  5.        ShowMessage('Error en division, ¡El denominador no puede ser cero!');
  6.   end;

La excepción no se genera, pero si las constantes las cambio por variables.....
 

delphi
  1. Y := 100;
  2. Z := 0;
  3. try
  4. X := X/Y;
  5. except
  6. on EZeroDivide do
  7. ShowMessage('Error en division, ¡El denominador no puede ser cero!');
  8. end;

Si se genera la excepción.

Lo interesante de ésto es que el valor que tiene X cuando la división es con constantes es igual a INF (Infinito o indeterminado)
 
Solo eso :)
 
Saludos

Archivos adjuntos

  • Archivo adjunto  INF.png   288,63KB   0 descargas

  • 0

#2 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 541 mensajes
  • LocationEspaña

Escrito 27 marzo 2019 - 01:21

interesante...

 

Saludos

 

 


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.231 mensajes
  • LocationArgentina

Escrito 27 marzo 2019 - 12:02

El porque del INF (que significa INFINITO, Indeterminado es NaN: Not is A Number) se debe a que es justamente lo que el estándar IEEE dice que debe ser. No vendría mal recordar aquel hilo sobre "Lo que todo informático debe saber sobre aritemética flotante". ;)

 

Ahora bien, el porque no reporta la excepción en un caso y el otro si tiene más pinta de un fallo. Deberías reportarlo amigo. Pensé que podría ser cosa de como el compilador está leyendo la palabra de control para el flag de excepciones para estos tipos de casos pero creo que no vaya por ahí el problema (*)

 

(*) sobre este temita del flag y la palabra de control Delphi ofrece una función que permite enmascarar excepciones que debe elevar el micro. No es algo habitual que se cambie la "configuración" pero es bueno considerarlo. Para más info sugiero leer el material del hilo que comenté antes. Usen el buscador.

 

De cualquier forma sería oportuno justamente, si no reporta la excepción, de evaluar que el número almacenado en el resultado sea un número válido y no una constante como INF o NaN. Porque de no hacerlo, más de una sorpresa nos llevaríamos después si tenemos que usar esa variable.

 

La otra es controlar antes que nada que el divisor no sea 0.

 

Si nos dices con cual versión de Delphi lo probaste para comprobar si es cosa del compilador de una versión en particular o si es general.

 

Saludos,


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.922 mensajes
  • LocationMéxico

Escrito 27 marzo 2019 - 01:37

El porque del INF (que significa INFINITO, Indeterminado es NaN: Not is A Number) se debe a que es justamente lo que el estándar IEEE dice que debe ser. No vendría mal recordar aquel hilo sobre "Lo que todo informático debe saber sobre aritemética flotante". ;)
 
Ahora bien, el porque no reporta la excepción en un caso y el otro si tiene más pinta de un fallo. Deberías reportarlo amigo. Pensé que podría ser cosa de como el compilador está leyendo la palabra de control para el flag de excepciones para estos tipos de casos pero creo que no vaya por ahí el problema (*)
 
(*) sobre este temita del flag y la palabra de control Delphi ofrece una función que permite enmascarar excepciones que debe elevar el micro. No es algo habitual que se cambie la "configuración" pero es bueno considerarlo. Para más info sugiero leer el material del hilo que comenté antes. Usen el buscador.
 
De cualquier forma sería oportuno justamente, si no reporta la excepción, de evaluar que el número almacenado en el resultado sea un número válido y no una constante como INF o NaN. Porque de no hacerlo, más de una sorpresa nos llevaríamos después si tenemos que usar esa variable.
 
La otra es controlar antes que nada que el divisor no sea 0.
 
Si nos dices con cual versión de Delphi lo probaste para comprobar si es cosa del compilador de una versión en particular o si es general.
 
Saludos,


Hola amigo,

En efecto, eso quiere decir INF, lo hice con delphi 10.1 Berlin. (y)

Saludos
  • 0