28.4.06

1124.- A futuro

Leo este post, y quiero hacer la cuenta en matlab o en alguno de los otros problemas a ver qué está pasando y por cuánto falla.

No es que dude del resultado, pero es bueno chequearlo uno mismo -en lo posible antes de postearlo-, y en este caso no lo hice. Además, quiero ver más adelante en versiones nuevas qué pasa.

Es un detallecito a tener en cuenta con las demostraciones computacionales.

4 comentarios:

JuanPablo dijo...

donde dice "problemas" debe decir "programas"

Matias dijo...

Hice la prueba en Maple (v9.5)
El problema aparece cuando evalua en punto flotante. Primero puse
suma := proc(n)
local i,s;
s := 0; i := 0;
while (s < n) do
i := i+1;
s := s + floor(log(i)/log(2));
od;
printf("Resultado: %a. Suma: %a.\n", i,s);
end;

Si uno pide ahora suma(1994) responde bien 312.

La segunda prueba es
suma2 := proc(n)
local i,s;
s := 0; i := 0;
while (s < n) do
i := i+1;
s := s + floor(evalf(log(i))/evalf(log(2)));
od;
printf("Resultado: %a. Suma: %a.\n", i,s);
end;

Aqui, suma2(1994) responde mal 313.
El problema es de redondeo, efectivamente:

> log(16)/log(2);
4
> log(16);
4 ln(2)
> evalf(log(16))/evalf(log(2));
3.999999999

Internamente, pareciera que log(16) lo guarda como 4.ln(2), sin redondear. De hecho suma() tarda mucho mas en correr que suma2().

ihi dijo...

Alguna vez participe en buscar problemas en los que la solucion "facil" usando la computadora genere "errores" que no son facilemente detectables.

Siempre quedo extender esta actividad hacia paquetes de software matematico tipo Mathematica, Maple, etc. Ahora veo que efectivamente era posible.

JuanPablo dijo...

¿problemas de Olimpíadas, competencia Paenza tal vez?