[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Un while() de perl



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



Reply to: