Es un problema muy viejo de los ordenadores, por la imposibilidad de representar determinados valores en punto flotante.
Ejemplo:
Using bash Syntax Highlighting
$
perl -le '$#="%.20g"; $x=0.2; print $x'
0.20000000000000001Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Ya sólo con almacenar 0.2 estamos cometiendo un error.
En el ejemplo indicado por creating021, lo que ocurre es que estamos acumulando error tras error y por eso al final la diferencia es tan grande.
En un trabajo normal con el ordenador no solemos ver estos problemas porque los programas suelen redondear los cálculos a números con muchos menos dígitos significativos:
Using bash Syntax Highlighting
$
perl -le '$x=0.2; print $x'
0.2Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
En cambio, saber esto es crucial cuando estamos haciendo muchas operaciones matemáticas y necesitamos obtener una gran precisión.
En Perl contamos con dos módulos que nos pueden ayudar en estas tareas:
Integer y
Math::BigFloat, que, con unos leves cambios, nos arreglan el problema:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Math
::BigFloat;
my $cent = Math
::BigFloat->new(0
.01
);
my $total = Math
::BigFloat->new(0
.00
);
print "Total $total\n";
for ( my $i = 0; $i < 1000; $i++){
$total += $cent;
}
print "Ahora tengo $total y deberia ser 10\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
- Código: Seleccionar todo
Total 0
Ahora tengo 10 y deberia ser 10