Comunidad de diseño web y desarrollo en internet online

Bug en ActionScript?

Citar            
MensajeEscrito el 01 Feb 2008 03:04 pm
Muy buenas, me imagino que el posible fallo estará en el código, porque de lo contrario existe un bug en ActionScript.
Me explico: el tema es, a partir de cierto número entero, ir restandole 0.1 en un bucle. Sencillo, no?
Es decir, si tuvieramos el 3, le iríamos restando 0.1, obteniendo 4.9 , 4.8 , 4.7 ... y así sucesivamente hasta llegar al 0.

Aquí pego el código que estoy utilizando (esto lo tengo en las acciones del primer fotograma):
----------------------------------------------------------

//Inicializo speed a 3
speed=3;
//mientras speed sea mayor que 0
while(speed>0)
{
//le resto 0.1
speed-=0.1;
//imprimo el valor de la variable speed en cada iteración del bucle
trace(speed);
}

-------------------------------------------------------------------------
Simple y sencillo, todo parece funcionar bien , veremos en lo alto de la lista del trace el 3, y a partir de ahi 2.9 , 2.8 , 2.7........ 2.3 , 2.2 , 2.1 , 2 , 1.9 , 1.8 , 1.7 ,.........1.2 , 1.1 y ¡oh sorpresa! 0.999999998, donde debería haber un 1. A partir de ahí ya se vuelve loco y acaba por sacar un numero elevado a e-16 !!

Si no me creeis, hacer la prueba :wink:
Y, por qué no falla al llegar al 2, y sí al llegar al 1? No es el mismo tipo de resta?

Alguien tiene alguna idea o explicación para esto?

Gracias por adelantado.
Fdo: Un Prometeo Desesperado

Por Prometeo

9 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Feb 2008 03:56 pm
Al probar tu script, me sale algo así:
3
2.9
2.8
2.7
2.6
2.5
2.4
2.3
2.2
2.1
2
1.9
1.8
1.7
1.6
1.5
1.4
1.3
1.2
1.1
0.999999999999998
0.899999999999998
0.799999999999998
0.699999999999998
0.599999999999998
0.499999999999998
0.399999999999998
0.299999999999998
0.199999999999998
0.0999999999999985
-1.52655665885959e-15 -> WTF??.
Tienes razón Prometeo!, un misterio total :p.
Oh gran freddie, dios de la fertilidad, haznos el honor de responder este inquietante resultado U_U

Por gustavogarzon

166 de clabLevel



 

msie7
Citar            
MensajeEscrito el 03 Feb 2008 12:22 am
Por debajo del valor 1 y hasta el valor -1, es decir decimales de 0,xx el nº se almacena en coma flotante con el complemento a 2. Esto hace que la salida sea un divisor aproximado entre 1 y -1.
No me extiendo en la explicación exacta del arrastre de bits <<.
Lo verás mejor si cambias:
while(speed>0)
por :
while(speed>-2)

Eso pasa porque en AS2 no se pueden definir los tipos de Number.
En AS3 si se puede, y esto no pasa si se define correctamente.

Otro ejemplo:

Código :

for(n=3; n>-2; n-=.1){
if(n==0) trace ("ahora n vale cero " + n);// esto nunca saldrá!!
trace(n);
}


Es la misma causa que produce que un mismo color se pueda expresar en decimal con 2 números distintos y el compilador encima nos dice que son distintos los colores ( normalmente una putada, pero yo lo aprovecho para algunos "truquillos")

Nota: -1.52655665885959e-15 es el nº: -0.00000000000000152655665885959 "casi" 0 pero no 0.

Por Teseo

SWAT Team

1780 de clabLevel

14 tutoriales

Genero:Masculino   SWAT

firefox
Citar            
MensajeEscrito el 05 Feb 2008 06:03 pm
Hola de nuevo, lo primero agradeceros que os hayáis tomado la molestia de probar el script e intentar encontrar una respuesta a este enigma.

Teseo, la forma de almacenar el numero entre -1 y 1, sí que debe ser la causa del problema, ya que es precisamente en esos números donde falla el script. Completamente de acuerdo, y enigma resuelto. Por otro lado, lo que explicas de los colores en decimal, se refiere a que podemos escribir, p. ej, el rojo, tanto como #FF0000 como #F00. O te refieres a otro truquito? If es así, por favor, compártelo :P

Un saludo.

Por Prometeo

9 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.