jueves, 5 de noviembre de 2009

C-Errores de software: Mariner 1

Yo aun no habia nacido cuando en el año 1962 se iba a lanzar la sonda Mariner 1 para un viaje a Venus. Hace ya muchos años de aquello, asi que cualquiera que sepa que sobre el 1975 tener un ordenador de 64k (capacidad que ahora multiplica muchas veces cualquier movil que regalen en cajas de galletas) era lo maximo aspirable, puede imaginar que posiblemente eso era lo que tenia la NASA en el 1962. Cuando yo tuve mi Amstrad 64k con casette alla por el 1985 hacia bastantes virguerias con el (creo que era uno de los pocos que lo usaba para estudiar mas que jugar, de hecho me lo lleve para estudiar en la facultad aunque no consegui sacarle partido), asi que tampoco podia considerarse una memoria ridicula.
Volvemos a la NASA. El cohete que portaba la sonda despego y al poco tiempo empezo a desviarse de la trayectoria. Como el sistema de correccion manual fallo, al final optaron por destruir el cohete y con el la sonda, lo cual equivalia a una millonada de la epoca y el consiguiente varapalo en su lucha contra la Union Sovietica (sobre esto, aunque sea irme por las ramas, dire que la NASA se gasto una pasta en inventar un boli que escribiera en el espacio, por eso de los problemas de la gravedad, mientras que los sovieticos fueron muchisimo mas listos y se llevaron un lapiz).
Al analizar lo sucedido, segun lo que trascendio (que no tiene porque ser verdad ni tampoco mentira), se indico que fue por culpa de un fallo en la trasliteracion de una formula de una pizarra al ordenador. Segun la informacion mas exhaustiva que he encontrado, el codigo era FORTRAM (que desconozco totalmente) y el error fue este:
...
IF (TVAL .LT. 0.2E-2) GOTO 40
DO 40 M = 1, 3
W0 = (M-1)*0.5
X = H*1.74533E-2*W0
DO 20 N0 = 1, 8
EPS = 5.0*10.0**(N0-7)
CALL BESJ(X, 0, B0, EPS, IER)
IF (IER .EQ. 0) GOTO 10
20 CONTINUE
DO 5 K = 1. 3 (cuando tenia que haber escrito: DO 5 K = 1, 3 !!!UNA COMA POR UN PUNTO!!!)
T(K) = W0
Z = 1.0/(X**2)*B1**2+3.0977E-4*B0**2
D(K) = 3.076E-2*2.0*(1.0/X*B0*B1+3.0977E-4*
*(B0**2-X*B0*B1))/Z
E(K) = H**2*93.2943*W0/SIN(W0)*Z
H = D(K)-E(K)
5 CONTINUE
10 CONTINUE
Y = H/W0-1
40 CONTINUE
...

Viendo los numeros, uno al que le suenan algo estas cosas, ve que los decimales empleados tenian muy baja exactitud (E-4), con lo cual era normal que se desviara. Si se tiene en cuenta que puede haber fallos de orden la la diezmilesima, en 1 km. no se nota apenas, pero en un viaje al espacio puede acabar en el planeta vecino porque el error se multiplicaria. Lo de la coma no se como afectaria, pero lo otro seguro que si.
Es considerado uno de los 10 fallos informaticos mas graves de la historia y con razon. Afortunadamente los fallos en mis programas no salen tan caros.

No hay comentarios:

Publicar un comentario