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

Kubuntu 6.06 en Dell Inspiron 640m

Technorati Tags: , , , , ,

Bueno, por fin encontré un hueco para instalar Linux en el nuevo portátil, concretamente Kubuntu. Ya probé el Live CD de Kubuntu 6.06 (Dapper) y conseguí configurar el modo gráfico con la pantalla panorámica sin problemas, y observé que detectaba bien el controlador Bluetooth integrado y la Wifi funciona perfectamente con el acceso de TID.

Antes de nada, mencionar que el modelo Dell Inspiron 640m se actualiza constantemente con hardware nuevo, y la configuración que yo tengo es la siguiente:

Procesador Intel Core 2 Duo T5600 a 1,83 GHz
Memoria 2 GB DDR2 a 667 MHz de doble canal
Disco duro 120 GB 5400 rpm SATA
Unidad óptica Regrabador de DVD/CD Optiarc 8x
Sonido Intel 82801G integrada
Red Módem integrado
Ethernet Broadcom 4400 10/100BaseT
IEEE802.11a/b/g Intel Pro WLAN 3945
Conectividad Bluetooth 2.0 Dell TrueMobile 350
Firewire Ricoh
Lector de tarjetas SD/xD/MMC Ricoh
USB: 4 puertos
Conector PCMCIA
Salidas de televisión y VGA

Me descargué la última versión disponible, la 6.10 (Edgy), pero hasta hoy no he podido coger un CD en el que grabarla (vago que es uno para ir a comprar). Tristemente, no he conseguido iniciar el Live CD ni siquiera con el modo gráfico seguro, que es lo que hace falta para arrancar el de Dapper.

Después de dos intentos (modo normal y luego modo seguro), he deducido que el problema está en el controlador gráfico que intenta cargar Edgy, el i810, mientras que Dapper carga el vesa, a 1024×768. Como la gráfica es una i945GM, parece que no se lleva bien con ese driver para la resolución 1440×900 y necesita un parche.

Ahora, una vez realizada la instalación del sistema base de Dapper para 32 bits (cargada en modo seguro, «secure graphics mode»), hay que realizar una serie de operaciones para dejar el sistema listo para ser usado:

  1. Configurar los repositorios.
  2. Instalar el soporte para múltiples procesadores (SMP), ya que se trata de un procesador Core 2 Duo, de doble núcleo.
  3. Posibles problemas con la tarjeta Wireless.
  4. Instalar el controlador gráfico y reconfigurar el servidor gráfico.
  5. Configurar el touchpad Synaptics.
  6. Configurar las teclas de acceso rápido.
  7. Enjoy!

Sigue leyendo

Share