Foros del Web » Creando para Internet » Flash y Actionscript »

¿Por qué este bucle no funciona como espero?

Estas en el tema de ¿Por qué este bucle no funciona como espero? en el foro de Flash y Actionscript en Foros del Web. Código: on (release) { N = 10; do { N = N/10; if (M.Intensity > N) { M.Intensity = M.Intensity - N; N = 0; ...
  #1 (permalink)  
Antiguo 21/05/2014, 20:29
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
¿Por qué este bucle no funciona como espero?

Código:
on (release) {
    N = 10;
    do {
        N = N/10;
        if (M.Intensity > N) {
            M.Intensity = M.Intensity - N;
            N = 0;
        }
    } while (N > 0);
}
Cuando M.Intensity es 0.1, al presionar el botón se transforma en 1.38777878078145e-16
De hecho he visto que en tal caso, o sea al 0.1, le resta 0.1, como si 0.1 fuese mayor que 0.1. What the hell !?

Lo he probado separadamente -em varios frames, no en do while- y anda bien. Claro no sería bueno ponerlo en varios frames, es un código para un botón...
  #2 (permalink)  
Antiguo 21/05/2014, 21:57
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Por qué este bucle no funciona como espero?

http://www.actionscript.org/forums/a...3/t-85396.html

  #3 (permalink)  
Antiguo 24/05/2014, 19:59
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Por qué este bucle no funciona como espero?

¡No he podido solucionarlo!

Este es el nuevo código:
Código:
on (release) {
    if (M2.Intensity>1) {
        M2.Intensity = M2.Intensity-1;
    } else {
        M2.DoW = 1;
        M2.Multip = 1;
        do {
            M2.Multip = M2.Multip*10;
            if (M2.Intensity*M2.Multip>1) {
                A = M2.Intensity*M2.Multip;
                M2.Intensity = (M2.Intensity*M2.Multip-1)/M2.Multip;
                M2.DoW = 0;
            }
        } while (M2.DoW == 1);
    }
}
Esta vez el error ocurre en 0.01.

En ese momento, al presionar el botón, cambia a:
8.88178419700125e-18

El muy hdp dice que A == 1, o sea, que M2.Intensity*M2.Multip es 1, pero antes el hdp entendió que eso era > 1, véase el if...

Así no se puede che...

Puse la variable A para detectar qué había mal. Las expresiones M. y M2. no importan aquí.

¿Solución?
  #4 (permalink)  
Antiguo 26/05/2014, 08:08
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: ¿Por qué este bucle no funciona como espero?

Parece un simple problema de precisión en coma flotante. 0.1 en binario resulta ser un decimal periódico, con lo cual, al restar (en Begin Test 1), aparentemente va bien hasta que llegas a restar (en teoría) 0.1 de 0.1, solo que ninguno de los dos valores vale realmente 0.1, y te queda ese resultado de 1.38777878078145e-16 (es decir, CASI cero, pero no cero). Fíjate que, cuando le vuelves a restar 0.1, te sale -0.0999999999999999 (es decir, CASI -0.01, pero no -0.01), aunque luego parece que se vuelve a arreglar (de hecho, si pudieras imprimir esos valores con potrocientos decimales, verías que no todos te saldrían tan redondos).

Echa un vistazo a este post, donde respondí a alguien que, en una validación de datos, resultó que sumar 10 veces 0.1 no le salía 1.0:

http://www.forosdelweb.com/f96/valid...7/#post4153049

Saludos,
  #5 (permalink)  
Antiguo 26/05/2014, 19:17
Tachikomaia
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Por qué este bucle no funciona como espero?

Código:
on (release) { 
   if (M2.Intensity>1) { 
      M2.Intensity = M2.Intensity-1; 
   } else { 
      M2.DoW = 1; 
      M2.Multip = 1; 
      do { 
         M2.Multip = M2.Multip*10; 
         if (Math.round(M2.Intensity*M2.Multip) >1) { 
            M2.Intensity = (Math.round(M2.Intensity*M2.Multip)-1)/M2.Multip; 
            M2.DoW = 0; 
         } 
      } while (M2.DoW == 1); 
   } 
}
Usar Math.round me ayudó con la precisión, pero en mi código borra números que no quiero borrar, tengo que arreglarlo -es OTRO problema, otro asunto-, pero además sólo funciona hasta 0.00001, después empieza a poner expresiones como 3.5e6, exactas quizá pero no son lo que quiero que aparezca en el cuadro de texto xD

a) Otros me han dicho eso ¿pero se puede en Flash 5 de Macromedia? Es lo que uso. Cuando defino variables no especifico tipo, no sé si ayudaría ni si se puede. Leeré los documentos en algún momento, quizá... -odio leer esas cosas >_< -

b) Y si tienen dos decimales sería 1.00? Y así sucesivamente? Espero no olvidar esto que dices, pero me resulta un tanto extraño y he podido sortear el problema, por ahora, usando Math.round.
Supongo que 0.1*100 puede dar 1.0000000000001. Lo cual sería > 1, ergo daría errores o resultados que no se quiere, cuando se pone como condición que sea > 1 o que no. Pero con Mah.round se borran las variaciones "insignificantes".

El problema actual es lograr que en el cuadro de texto aparezcan los números y no las expresiones tipo 3.5e6. Pensé que una tal "parse", una función, convertía o obligaba a convertir/mostrar esas expresiones en números, pero si puede no sé cómo, la he usado y me da los mismos problemas llegado el mismo punto.

Gracias. La verdad estoy hecho un lío, tengo que pensar algunas cosas.
  #6 (permalink)  
Antiguo 28/05/2014, 08:55
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: ¿Por qué este bucle no funciona como espero?

No sé nada de Macromedia Flash 5, así que poco o nada puedo decirte por ese lado. Sobre los redondeos, no sé cómo trabaja esa función (o método, o lo que sea) que citas, pero sí te indico que puedes encontrar dos tipos de redondeo. Uno de ellos te hará un redondeo real, al número de cifras decimales que le pidas (aunque puedes seguir teniendo el problema de que, por temas de precisión interna, el número que queda tampoco sea exactamente el que teóricamente debería ser). El otro es el redondeo "a efectos de mostrar el valor" (en pantalla, en impresora, en archivo de texto, ...). Te presentará el número convenientemente redondeado, pero sólo a efectos de impresión, el número, internamente, seguirá estando sin redondear. Imagino que, para lo que quieras hacer, Flash 5 deberá tener algún modo de especificar el formato de los números. Y es que,aunque sea una lata, de vez en cuando hay que mirar la documentación.

Saludos,

Etiquetas: bucle, programación-general
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:04.