Archivo de la etiqueta: Computadores

Programación en C

https://www.garceta.es/catalogo/libro.php?ISBN=978-84-1903-425-0&idd=12

Aprender a programar constituye hoy en día una de las competencias fundamentales en la formación de cualquier ingeniero. Incluso en un mundo en el que las herramientas de Inteligencia Artificial están cada vez más presentes y facilitan muchas tareas, comprender cómo funciona un programa, cómo se organiza un algoritmo y cómo se traduce una idea en código sigue siendo imprescindible. El ingeniero no puede limitarse a utilizar soluciones ya hechas: debe ser capaz de analizar un problema, diseñar una estrategia de resolución y llevarla a la práctica con precisión y rigor.

Este libro está destinado a los estudiantes universitarios que se enfrentan por primera vez al aprendizaje de la programación. No se requieren conocimientos previos: el texto parte desde los conceptos más básicos y avanza de forma gradual, apoyándose en una gran cantidad de ejemplos explicados con detalle. Sin embargo, el camino recorrido conduce hasta un nivel medio de programación, que permitirá al lector enfrentarse a problemas de cierta complejidad y sentar las bases para aprendizajes más avanzados.

La extensión y profundidad del libro hacen que difícilmente pueda agotarse en un único semestre. Más bien, debe entenderse como un manual de referencia que acompaña al estudiante durante toda su formación inicial: una obra a la que volver en distintos momentos para repasar conceptos, reforzar técnicas o explorar nuevas posibilidades del lenguaje C.

A lo largo de sus capítulos se incluyen cientos de ejemplos repartidos estratégicamente para ilustrar cada idea, junto con más de doscientos ejercicios propuestos que permiten practicar y afianzar los contenidos. Cada ejercicio va acompañado de su solución, de manera que el alumno pueda comprobar su progreso y, al mismo tiempo, aprender distintas formas de abordar un mismo problema.

Pero aprender a programar no consiste solo en lograr que un programa funcione. La programación es también un medio de comunicación entre personas: el código debe ser comprensible, legible y mantener una estructura clara. Por ello, este libro insiste de manera constante en las buenas prácticas de programación, en el estilo y en la importancia de escribir programas que puedan ser entendidos y mantenidos por otros.

La elección del lenguaje C como punto de partida responde a varias razones. Se trata de un lenguaje con una larga tradición en el mundo de la ingeniería y la informática, en el que se apoyan muchos otros lenguajes modernos. Aprender C significa adquirir un conocimiento profundo de los fundamentos de la programación, de la relación entre el código y la máquina, y de los principios que siguen vigentes en entornos actuales. C, con su sencillez y potencia, ofrece al principiante una oportunidad única de comprender de verdad cómo se construye un programa desde sus cimientos.

En suma, este libro no pretende únicamente enseñar a programar en C, sino formar en el arte de pensar de manera algorítmica, rigurosa y creativa. Su meta es que los estudiantes, además de aprobar un curso, desarrollen una herramienta intelectual que les será útil durante toda su vida profesional como ingenieros.

Espero que este libro te acompañe en la aventura de descubrir la programación y que en cada página encuentres, no solo respuestas, sino también nuevas preguntas que despierten tu curiosidad como futuro ingeniero.

Santiago Higuera de Frutos

Doctor Ingeniero de Caminos

Profesor en Teleco Campus Sur

El problema del cero exacto en computación


La manera en la que los computadores tratan los números reales da lugar a algunas paradojas que es conveniente tener en cuenta para no cometer errores. Los ordenadores no operan con números reales, sino con unos números denominados de coma flotante. Por ejemplo en Octave y Matlab se utiliza el formato numérico denominado double  para representar los números reales,. El formato double permite operar números con hasta 15 decimales significativos. Esto hace que, en el caso de los números reales que tengan un número de decimales mayor que 15, el valor utilizado por el formato double sea una aproximación al número truncada a 15 decimales.

Números reales con más de 15 decimales significativos hay infinitos, en particular todos los números irracionales y los números racionales como el 1/3 o el 1/7, que tienen un número infinito de decimales. En todas las operaciones que realicemos con el ordenador en las que intervenga alguno de estos números, los resultados serán aproximados, no exactos.

Históricamente ha habido algunas catástrofes producidas por no considerar adecuadamente estas aproximaciones que realizan los ordenadores. Así sucedió en el caso de la explosión del  cohete Arianne 5 poco después del despegue o en el fallo de una batería de misiles Patriot que no pudo interceptar un misil SCUD disparado por las tropas iraquíes durante la guerra del Golfo [1 y 2].

Una situación concreta en la que hay que tener cuidado y que se da habitualmente en los problemas que se hacen en el curso es la de comprobar si el resultado de una operación entre números reales es igual a cero. El problema de comprobar si dos números reales son iguales es equivalente al anterior, pues comprobar si x es igual a y es equivalente a comprobar si (x-y) es igual a cero.  En general es incorrecto hacer la comparación if x==0′ o la comparación ‘if x==y’.Se puede comprobar con el siguiente ejemplo realizado en la consola de Octave:

Operando con números reales,  la comprobación (y-2)==0 debería arrojar un resultado verdadero y, en cambio, arroja un resultado falso. La raíz cuadrada de 2 es un número irracional y, por tanto, el valor utilizado por el ordenador es una aproximación. Si se utiliza el formato largo para mostrar los números en pantalla se podrá comprender lo que está pasando:

Se puede ver que la diferencia (y-2) es un valor muy pequeño, pero no exactamente cero.

Hay muchos ejemplos, algunos con operaciones aparentemente sencillas. El lector puede comprobar que al sumar 1/3 + 4/3 + 1/3 no se obtiene exactamente 2, como se muestra en la siguiente figura:

Para actuar de manera controlada en estas situaciones se puede utilizar un valor umbral, que se suele denominar tolerancia, para  comparar si determinada cantidad es cero. Lo que se hace es comprobar si la cantidad es menor en valor absoluto que el valor umbral utilizado. Si así sucede, se considera que dicha cantidad es cero.  Por ejemplo, si se toma como valor umbral de la tolerancia 1e-10, se podría hacer la siguiente comparación:

El valor umbral utilizado para la tolerancia dependerá del problema concreto. Por ejemplo, si se está trabajando en un problema de altitudes del terreno medidas en metros para una obra pública, puede ser suficiente considerar que un milímetro es la cantidad más pequeña a considerar, con lo que la tolerancia en ese caso podrá ser 1e-3 . En otros casos será necesario utilizar valores menores o mayores. Cuando se trate en el curso la resolución de ecuaciones no lineales se podrán ver algunos ejemplos.

Octave y Matlab proporcionan una constante denominada eps , que corresponde a la precisión de la máquina, y que depende del ordenador utilizado. El épsilon de la máquina es el número decimal más pequeño que, sumado a 1, la computadora nos arroja un valor diferente de 1, es decir, que no es redondeado. En el computador que hemos probado, el valor de eps es:

Este valor no nos sirve para utilizarlo como tolerancia, hay que  utilizar valores de la tolerancia seleccionados adecuadamente y que se adapten bien al problema concreto. Se puede comprobar que, en el ejemplo de la raíz de 2, el valor de la constante eps sería menor que el error que se comete y, por tanto, la comprobación seguiría arrojando valores erróneos:

[1]   http://www-users.math.umn.edu/~arnold/disasters/ariane.html

[2] https://www.xataka.com/historia-tecnologica/dia-que-misil-mato-a-28-soldados-porque-sistema-defensa-antimisiles-ignoro-error-0-000000095-segundos

Santiago Higuera (Noviembre, 2017 – Revisión en septiembre de 2021)

Este artículo se publica de manera simultánea en el blog Matemata https://blogs.upm.es/matemata/