Primero una peque�a modificaci�n a tu programa para poder jugar con
otros n�meros:
$ cat decimals3.pl
#!/usr/bin/perl
$num = $ARGV[0];
while ($num < 1.1) {
print "\$num vale $num\n";
$num += 0.1;
print "y despu�s $num\n\n";
}
~/debian$ ./decimals3.pl 0.7
$num vale 0.7
y despu�s 0.8
$num vale 0.8
y despu�s 0.9
$num vale 0.9
y despu�s 1
$num vale 1
y despu�s 1.1
$num vale 1.1
y despu�s 1.2
-------------------------------------
Ahora f�jate en lo siguiente:
$ cat decimals4.pl
#!/usr/bin/perl
$num = $ARGV[0];
while ($num ne '1.1') {
print "\$num vale $num\n";
$num += 0.1;
print "y despu�s $num\n\n";
}
~/debian$ ./decimals4.pl 0.7
$num vale 0.7
y despu�s 0.8
$num vale 0.8
y despu�s 0.9
$num vale 0.9
y despu�s 1
$num vale 1
y despu�s 1.1
Cuando crees que $num alcanz� un valor de 1.1, realmente en la memoria
est� almazenado un n�mero con muchas cifras decimales, ligeramente menor
que 1.1; pero al convertirlo a constante alfanum�rica (que es lo que
hace print "$num") se convierte en "1.1". El problema debe estar en la
forma como perl estar� representando "0.1" en bin�rio; no s� que m�todo
usar� para aritm�tica de punto flotante, pero por lo visto no debe ser
nada espectacular (el fuerte de perl no es el c�lculo num�rico).
Hace algunos a�os me pas� algo muy semejante con ghostscript y
finalmente llegu� a la conclusi�n que la culpa ni siquiera era de
ghostscript sino de una librer�a libc antigua; con versiones mas nuevas
ya no ocurr�a.
Ser�a interesante que le hicieramos el mismo test a varios lenguajes de
"scripting" como python, tcl, scheme, etc.
Jaime Villate