Limitaciones numéricas de Perl5

En los foros se suele comentar la potencia de Perl5 para manipular cadenas de caracteres, que de hecho es para lo que se diseñó el lenguaje. Podemos preguntarnos además qué capacidad tiene el lenguaje para las operaciones aritméticas con números reales, algo que normalmente no se ve en el código y queda escondido en los detalles de la compilación. Para entender la cuestión veamos un ejemplo programado en C y en Perl:

/* Ejemplo de Julio Freyre */
#include <stdio.h>
void main() 
{
   for(float x = 0; x < 1; x += .1) 
      printf("%f es menor que 1\n", x);
}

Ahora la versión en Perl:

# este programa muestra el error que acumula perl al sumar reales
for(my $x = 0; $x < 1; $x += .1) 
{
   print("$x es menor que 1\n");
}

# el error es de 1e-16, este programa ya funciona como se espera en arquitecturas i586 y SPARC
my $error = 1e-16;
for(my $x = 0; $x+$error < 1; $x += .1) 
{
   print("$x es menor que 1\n");
}

Si probáis estos programitas veréis la limitación de Perl al manejar números reales. ¿Qué se puede hacer para resolver esto? La solución más sencilla es utilizar un módulo de CPAN que se llama Math::BigFloat, que permite usar una precisión arbitaria, elegida por el usuario, para representar reales y operar con ellos, por supuesto con un coste en el tiempo de ejecución.

En relación con esto hay otro módulo, llamado Math::BigInt que permite extender la capacidad intrínseca del lenguaje y la arquitectura física subyacente para representar enteros.

La extensión RPerl permite hacer calculos numéricos si estas limitaciones de y de manera muy eficiente.

Otra opción es usar de manera nativa otros lenguajes para estas tareas, como se explica en el Taller de (bio)perl.

Estas limitaciones han sido superadas desde el diseño en Perl6.

Bruno Contreras-Moreira
http://www.eead.csic.es/compbio