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:
donde dice "problemas" debe decir "programas"
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().
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.
¿problemas de Olimpíadas, competencia Paenza tal vez?
Publicar un comentario