Hasta ahora hemos visto la potencia de Perl 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, más bien 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, con un coste en el tiempo de ejecución.
Por cierto, 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.