Operaciones en punto flotante con Tcl

Una de las cosas no tan buenas de ns2 es que la interfaz usa el lenguaje Tcl (Toolkit command language) para definir las simulaciones y algunas cosas internas como los enlaces. Este lenguaje es interpretado, lo cual es bueno, pero su sintaxis es un poco engorrosa. Por si fuera poco, las operaciones en punto flotante son un poco delicadas, y he experimentado el hacer una división de dos enteros positivos y obtener un número negativo. Por ejemplo, el siguiente código:

set n_nodos 15
set burst_length 40000
set channels 8
set carga 1
set bandwidth 10000
set bw [expr $bandwidth * 1000000]

set mean_time [expr double(($n_nodos - 1) * $burst_length * 8) / double($channels * $carga * $bw)]

Da como resultado: -0.0027923583205257166

Esto lo descubrí al intentar simular una red con enlaces a 10 Gbps (de ahí el bandwidth=10000) con una carga normalizada a 1. De nada sirve colocarle la conversión explícita a double al hacer la división. La opción por la que opté en su momento fue hacer la operación en dos pasos:

set mean_time [expr double(($n_nodos - 1) * $burst_length * 8) / double($channels * $carga * $bandwidth)]
set mean_time [expr double($mean_time) / 1000000]

También es posible convertir a double el factor que multiplica los Mbps en la variable bw y conservar el resto del código anterior:

set bw [expr $bandwidth * double(1000000)]

Share