Cosas tendiendo a cero

“She was a mink handjob in sarcophagus heels”

Archivos para Julio 18th, 2008

Raíz cuadrada

Publicado por Griseo Mitran en Julio 18, 2008

En informática nos encontramos casi siempre alguna asignatura con el siguiente ejercicio: “Realiza un programa que dado un número de como resultado la raíz cuadrada de un número entero.”

Aparentemente no hay problema, ya que el algoritmo sería empezar con hacer el cuadrado del cero comparar con el número que te da el usuario, y si no es igual o mayor sigues con el uno en vez del cero, y si éste no es igual o mayor sigues con el dos en vez del uno, y así sucesivamente hasta que sea igual o mayor. Es decir haces un bucle while (o uno for, todo depende del carácter del programador) con esa condición, para que cuando salga del bucle reste uno al parámetro comparado del bucle (no al número dado por el usuario) y haces que el programa devuelva dicho valor como resultado. Y voila, ya tienes un programa hecho por ti que realiza la raíz cuadrada. Ejercicio finalizado.

Total se lo enseñas al profesor, y éste te dice: “Fatal, te daría un cero si lo hubieses hecho en un examen.” ¿Cómo puede ser posible? Pues porque hablamos de números enteros, es decir los números negativos están incluidos y no hemos pensado en que hacer con ellos, de hecho si el número fuese negativo nuestro programa devolvería siempre el valor -1. Es decir, para nuestro programa la raíz cuadrada de -12355789 es -1, para -50000 también es -1, y para todo número negativo el valor resultado será -1. En fin, que para solucionar este caos nos vemos la necesidad de mirar un libro de matemáticas (o la wikipedia) que nos dice: “La raíz cuadrada de un número negativo no existe.” ¡Toma ya! ¡He ahí una buena estrategia! Entonces decidimos poner que si el número es negativo, el programa devolverá un mensaje por pantalla que diga “La raíz cuadrada de un número negativo no existe.”

Con nuestro programa ya modificado se lo enseñamos al profesor y nos dice: “Peor. Imaginate que el usuario está haciendo una modificación con el photoshop de una foto y de repente le salta una ventana que poné “La raíz cuadrada de un número negativo no existe.”. Imaginate la cara del usuario, el pobre no entenderá ni porque ha salido éso. O peor aún imaginate que un cohete vaya de camino a Marte y necesite realizar la raíz cuadrada para trazar su trayectoria ¿Sabes lo que podría pasar por culpa de ese mensaje?”

Ésto ya es demasiado, así que le preguntamos al profesor cual es la solución a la hecatombe del número negativo. Y dependiendo de la asignatura que él dé nos responderá de una forma u otra:

Si es profesor de base de datos nos dirá: “Sea como sea, debe de devolver el valor null, ya que este valor indicará que no existe dicha raíz cuadrada o bien se desconoce. Ya que null es el “no lo sé” de la lógica trivaluada.”

Un profesor de teoría de autómatas y lenguajes formales nos dirá: “Qué devuelva cero. Pues el resultado ha de ser un número natural ya que los números enteros no los contemplamos en la informática teórica. Porque recuerda que el número de números naturales es igual al de los enteros. Es decir hay una cantidad de aleph sub cero números en los naturales, en los enteros y en los racionales (ya que se pueden establecer biyecciones entre todos ellos). El problema sería que fueran números reales, ya que el número de números reales es aleph sub uno. Pero el ejercicio habla de números enteros así que el programa ha de devolver cero en caso de que el número sea negativo, pues el resultado será un número natural al no especificar nosotros nada sobre el resultado, y cero es el número natural más adecuado.”

En cambio si el profesor es uno de programación en sistemas de tiempo real dirá: “Coloca una excepción que dé un resultado que el programa vuelva a un estado estable, es decir pon, por ejemplo, en esa excepción que el programa devuelva -1 en caso de que el número de entrada sea negativo y un comentario diciendo que ese campo de excepción puede ser modificable por otro programador dependiendo del uso futuro del programa (un abs, un brazo mecánico de un robot,…).”

Si es uno de tipos abstractos de datos te dirá: “Haz que el resultado de dicha operación se mande para el kind, es decir para el supertipo. Y luego en función de si el número es positivo o negativo la función raíz cuadrada se resolverá o no. En caso de que no se resuelva se quedará en el kind, en caso de que si se resuelva el resultado quedará en el conjunto de los naturales. Es entonces cuando te das cuenta de que también has de hacer una reasociación de tipos comparando cuales están dentro de los naturales y cuales no.”

Y en caso de ser un profesor de laboratorio de tecnología de objetos dirá: “Haz que el programa lance una excepción que devuelva como mensaje que “La raíz cuadrada de un número negativo no existe.”, ya el uso de esa excepción será modificada por otro programador en caso de fallo o no, eso a ti no te importa. Lo que importa es que el manejo de excepciones es esencial para resolver el problema.”

Por eso estudiar informática es, a veces, tan coñazo, porque ni un profesor se pone de acuerdo en cosas esenciales lo que lleva a quebraderos de cabeza como “Según la filosofía de esta asignatura, ¿Qué debo hacer para resolver este problema?”.

Publicado en Hablando sólo | Etiquetado: , , , , | No hay comentarios »