Excepciones de coma flotante y verificación de variables

Technorati Tags: , , ,

Cualquiera que haya programado cierto tiempo y haya tenido que realizar divisiones con variables que no se sabe a priori qué valor van a tomar sabe que, tarde o temprano, ocurrirá alguna excepción de coma flotante, debida a un intento de dividir por cero (porque la variable en ese momento tiene el valor cero, o uno muy cercano), terminándose la ejecución del programa.

Para evitar este problema, lo habitual es colocar una condición antes de realizar la operación de división y darle un valor fijo en caso de que el divisor sea cero. Algo tan sencillo como esto:

if (proporcion_[slot_out] > 0.0) {
deficit_[i] += (long long) (0.5 + (double) longitud_paquete * proporcion_[i] / proporcion_[slot_out]);
}

Debería ser suficiente para evitar que ocurriera algún problema ¿verdad? Pues no, ni mucho menos. Llevo unas semanas haciendo simulaciones con el código tal cual está. Hoy he cambiado a una red más grande y no hacía más que fallar, así que me he metido con el gdb y he encontrado que el fallo está en ese punto. Para comprobar que no entraba en ese ‘if’ he hecho lo que cualquiera: presentar por pantalla el valor de esa variable:

if (proporcion_[slot_out] > 0.0) {
printf(«Proporcion = %f\n», proporcion_[slot_out]);fflush(stdout);
// se puede hacer también sin redondear
deficit_[i] += (long long) (0.5 + (double) longitud_paquete * proporcion_[i] / proporcion_[slot_out]);
}

El resultado era el siguiente:

Proporcion = 0.000000
Exepción de coma flotante

Podríamos hablar del fallo horrográfico, pero no, a mí me gustaría saber por qué me presenta por pantalla el valor de la variable si se supone que al valer 0, no entra en el ‘if’. Arrea, que la precisión es finita, y los números que puede manejar la máquina pueden no ser representables con ese nivel de precisión. Hagamos un cambio en el código: que en lugar de mostrar con formato %f lo haga con formato %g (notación exponencial)…

if (proporcion_[slot_out] > 0.0) {
printf(«Proporcion = %g\n», proporcion_[slot_out]);fflush(stdout);
// se puede hacer también sin redondear
deficit_[i] += (long long) (0.5 + (double) longitud_paquete * proporcion_[i] / proporcion_[slot_out]);
}

El resultado, señoras y señores, no podía ser más preocupante:

Proporcion = 1.27e-319
Exepción de coma flotante

Teniendo en cuenta que si el valor de la proporción no es calculada en base a unos parámetros, su valor se fuerza a 0, es cuanto menos preocupante. Para arreglarlo nada como compararlo con un número muy pequeño, pero no demasiado, y eso porque trabajo con proporciones relativamente grandes (menores de 1, pero mayores de 1e-10, seguro), que si no, ya me iban a dar bien dado.

Share

El transistor balístico

Technorati Tags: ,

Leo en las noticias breves (PDF, 3,6 MB) de la revista de la Computer Society del mes de enero que unos investigadores están trabajando en un transistor balístico por deflexión (Ballistic Deflection Transistor, BDT), en el cual no se utilizan corrientes constantes para controlar la salida digital (0 o 1) de un transistor. En cambio, se utiliza un deflector triangular para desviar a una salida u otra un electrón, que sufrirá un desvío en función del campo eléctrico que atraviesa en la «puerta» del transistor. En la imagen se aprecia el funcionamiento.

Transistor Balístico

Al no existir corrientes continuas que polarizan los transistores, se reduce el consumo de potencia. Como son eficientes energéticamente, utilizan tensiones reducidas, generando menos ruido e interferencias. Adicionalmente, empleando materiales que mejoren el flujo de electrones, se podrían fabricar chips basados en estos transistores balísticos que funcionasen a frecuencias de Terahercios, tres órdenes de magnitud superior a los actuales.

Como consecuencia de este estudio, la NSF (National Science Foundation, Fundación Nacional para la Ciencia de EEUU) ha dado al equipo de investigadores 1,1 millones de dólares para que construyan un prototipo y para que den con una metodología de diseño de circuitos y posibles arquitecturas.

Share

Andrew S. Tanenbaum premiado por su contribución a la educación en computación

Technorati Tags: , , ,

Cada año, el comité de premios del IEEE nomina a un grupo de personas para recibir su premio más prestigioso, la IEEE James H. Mulligan, Jr. Education Medal (Medalla James H. Mulligan Junior de la Educación). La edición del año 2007 ha tenido como ganador de la mención a Andrew Stuart Tanenbaum (su página en la Universidad Vrije en Amsterdam), con la siguiente cita: «Por sus contribuciones a la educación en computación, especialmente organización de computadoras, redes y sistemas operativos».

Los ganadores de las ediciones anteriores se encuentran listados aquí.

AST es conocido en el mundo de la Informática y las Telecomunicaciones (sobre todo entre estudiantes) por sus libros sobre redes y sistemas operativos, además de ser el creador de Minix, un clon de Unix orientado a la enseñanza.

Mi más sincera enhorabuena para AST 🙂

Fuente: Department of Computer Science, Vrije Universiteit. Vía menéame: Andrew Tanenbaum gana el premio más prestigioso del IEEE.

Share

Servicio de AT&T para provisión de VPNs de nivel 1

Technorati Tags: , , , ,

AT&T ya ofrece un servicio óptico totalmente mallado y de gran ancho de banda bajo demanda para grandes clientes. Noticia original en inglés en NetworkWorld: AT&T offering fully meshed optical service.

Este nuevo servicio abre la puerta a la provisión de Redes Privadas Virtuales de nivel 1, que permite la interconexión de los nodos lejanos de un cliente a través de una red pública de un tercero, de forma totalmente transparente. En este caso, el cliente vería una red óptica, que podría controlar «virtualmente», gracias al uso de planos de control distribuidos, que introduce GMPLS (MPLS generalizado).

AT&T anunció este martes su Optical Mesh Service (Servicio de Malla Óptica), con el que los clientes pueden configurar una red óptica totalmente mallada, con menos puertos físicos, ancho de banda bajo demanda y costes más reducidos.

El director de conectividad y redes metropolitanas del operador, Mike Lesher, dice que su oferta permite a los clientes compartir el ancho de banda entre tantos sitios como tenga el cliente en su red óptica, eliminando la necesidad de disponer de múltiples puertos ópticos dedicados para soportar una red totalmente mallada.

Hoy en día, un cliente que necesite conectividad entre todos sus sitios tendría que disponer de múltiples puertos en cada lugar. Con el servicio de AT&T, en cambio, sólo se requiere un puerto físico hacia la red óptica inteligente de AT&T. Entonces, el cliente selecciona el ancho de banda que requiere para su red.

Por ejemplo, un cliente podría tener puertos OC-48 en 4 localizaciones y un puerto OC-48, a 2,488 Gbps, disponible para compartir entre esos 4 sitios. El servicio también permite al cliente reasignar rápidamente los recursos de ancho de banda entre los sitios.

Lesher asegura que, usando el portal del cliente de AT&T, los usuarios pueden solicitar que todos los puertos de 2,488 Gbps se dedican a uno de sus cuatro sitios. Este proceso dura entre 5 y 10 minutos. Los clientes pueden necesitar parte o todo el ancho de banda en uno de los sitios para manejar sesiones de distance-learning (teleeducación) o realizar una descarga de los datos financieros de la compañía.

Mientras que la mayoría de clientes tienen puertos del mismo tamaño que el ancho de banda dedicado, Lesher dice que los clientes también pueden solicitar puertos con mayor capacidad, como OC-48, pero usar (y pagar) únicamente por el ancho de banda que usen, como un OC-12 (622 Mbps). Esto permite disponer del puerto físico que puedan necesitar en el futuro, pero pagando por lo que usen hoy.

Un cliente con 4 o 5 nodos OC-48 dedicados podría obtener una reducción de costes entre el 30 y el 35% al contratar el nuevo servicio de malla óptica de AT&T. Lesher advierte sin embargo que los costes varían en gran medida dependiendo del número de nodos que necesite el cliente y cuánto ancho de banda contraten.

Share