Título: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: Tachikomaia en 5 Diciembre 2023, 10:17 am Quiero un programa que haga esto:
N = 0 N = 1 N = 10 N = 2 N = 101 N = 1000 etc O sea: 1era vuelta: Se produce un número de 1 cifra. 2nda: De 1 cifra, de 2 cifras. 3era: De 1 cifra, de 2 cifras, de 3 cifras. Y así sigue. Cada nuevo número de cierta cifra es +1 con respecto al anterior de esas cifras. Cuando con 1 cifra no haya más posibles, ya no se producen más de esos, lo mismo ocurre con los de cualquier otra cifra. Es que luego del 9 viene el 10 pero ese tiene 2 cifras, ya se produjo, no quiero que se produzcan repetidos. Hice este código y le puse traces porque me da un error que no entiendo: Código
Salida: Citar F2: Longitud: 1 Nombre: N1 N: 0 Se generó N1: 0 Se creó N2: 9 F2: Longitud: 1 Nombre: N1 N: 1 Se generó N1: 1 Nombre: N2 N: 10 Se generó N2: 10 Se creó N3: 99 F2: Longitud: 1 Nombre: N1 N: 2 Se generó N1: 2 Nombre: N2 N: 11 Se generó N2: 11 Nombre: N3 N: 100 Se generó N3: 100 Se creó N4: 999 F2: Longitud: 1 Nombre: N1 N: 3 Se generó N1: 3 Nombre: N2 N: 12 Se generó N2: 12 Nombre: N3 N: 101 Se generó N3: 101 Nombre: N4 N: 1000 Se generó N4: 1000 Se creó N5: 9999 F2: Longitud: 1 Nombre: N1 N: 4 Se generó N1: 4 Nombre: N2 N: 13 Se generó N2: 13 Nombre: N3 N: 102 Se generó N3: 102 Nombre: N4 N: 1001 Se generó N4: 1001 Nombre: N5 N: 10000 Se generó N5: 10000 Se creó N6: 99999 F2: Longitud: 1 Nombre: N1 N: 5 Se generó N1: 5 Nombre: N2 N: 14 Se generó N2: 14 Nombre: N3 N: 103 Se generó N3: 103 Nombre: N4 N: 1002 Se generó N4: 1002 Nombre: N5 N: 10001 Se generó N5: 10001 Nombre: N6 N: 100000 Se generó N6: 100000 Se creó N7: 999999 F2: Longitud: 1 Nombre: N1 N: 6 Se generó N1: 6 Nombre: N2 N: 15 Se generó N2: 15 Nombre: N3 N: 104 Se generó N3: 104 Nombre: N4 N: 1003 Se generó N4: 1003 Nombre: N5 N: 10002 Se generó N5: 10002 Nombre: N6 N: 100001 Se generó N6: 100001 Nombre: N7 N: 1000000 Se generó N7: 1000000 Se creó N8: 9999999 F2: Longitud: 1 Nombre: N1 N: 7 Se generó N1: 7 Nombre: N2 N: 16 Se generó N2: 16 Nombre: N3 N: 105 Se generó N3: 105 Nombre: N4 N: 1004 Se generó N4: 1004 Nombre: N5 N: 10003 Se generó N5: 10003 Nombre: N6 N: 100002 Se generó N6: 100002 Nombre: N7 N: 1000001 Se generó N7: 1000001 Nombre: N8 N: 9999999.99999999 16 > 8 MinLongitud: 2 F2: Longitud: 2 Nombre: N2 N: 17 Se generó N2: 17 O sea, no genera el número 8 ni el 9, porque, si lo interpreté bien, cuando N8 = 9999999 y Longitud = 8, y se hace esto: Código: Nombre = "N"+Longitud; Nombre = "N"+8 = "N8" N = eval(Nombre)+1 = eval("N8")+1 = 9999999+1 = 9999999.99999999 y apartir de ahí no sé qué hace, pero ya eso es un error ¿mío o qué pasa? ¿el máximo valor que puede tener una variable en Macromedia Flash 5 es 9999999.99999999 no 10000000? ¿o sea no más de 7 caracteres enteros? No me resulta un problema, creo, pero ¿por qué sucede eso? ¿tiene sentido? Si se puede guardar textos largos ¿por qué no un número? ¿o con números largos calcula mal tal como ocurre cuando son decimales? Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: D3s0rd3n en 6 Diciembre 2023, 01:28 am Más bien tiene que ver con una limitacion de los números flotantes en general. Es una consecuencia de que no todos los números decimales pueden ser representados exactamente con un número binario. Hay "hacks" y algoritmos que ayudan a mitigar esto pero ya es una limitacion de las computadoras binarias en general. Algunas lo resuelven mejor que otras pero todas lo tienen.
Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: Tachikomaia en 6 Diciembre 2023, 05:04 am Pero estos números son enteros, se convierten a decimal sin que haya habido decimales de por medio.
Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: Danielㅤ en 6 Diciembre 2023, 14:33 pm Hola, los números se convierten a decimales por las operaciones que hacés, un ejemplo sería una división que ingresas un número entero de 2 y lo divides por 4 te da como resultado un número decimal de 0,5
Saludos Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: EdePC en 6 Diciembre 2023, 16:12 pm Me parece que es problema de Flash 5, yo lo he probado en mi Macromedia Flash MX 2004 y sin problemas, incluso cuando exporto como Flash 5 desde ahí (Deberías migrar a Flash MS 2004 y AS2 XD)
Según la documentación de Math.pow() (https://i.ibb.co/72pzxdq/math-pow.png) Supongo que no lo terminaron de pulir porque yo veo que el compilado si que sale redondeado (he descargado e instalado Macromedia Flash 5 y un decompilador para comprobarlo) El código original: Código
Macromedia Flash 5 lo compila a: Código
Macromedia Flash MX 2004 lo compila a: Código
Pues arriba está aproximando y eso está causando tu problema, aunque se esté usando Flash 5 que supuestamente no usa aproximaciones. Una posible solución es forzar un redondeo con Math.Round: Código
--- Para ver como se termina compilando un swf se puede usar un decompilador flash, en mi caso usé JPEXS, un decompilador te permite ver a que instrucciones reales se convierte un script, y que el reproductor flash entiende Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: D3s0rd3n en 6 Diciembre 2023, 20:34 pm Hola, los números se convierten a decimales por las operaciones que hacés, un ejemplo sería una división que ingresas un número entero de 2 y lo divides por 4 te da como resultado un número decimal de 0,5 Esto. Como dije en mi otro mensaje los float point tienen ese problema. Es una de la limitaciones de nuestraaner de lleva la informática. Solo hay que tenerlo en cuenta y lidiar con el. Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: .xAk. en 7 Diciembre 2023, 04:14 am Fuente: https://actionsnippet.com/?tag=biginteger (https://actionsnippet.com/?tag=biginteger)
Adding Very Large Numbers Código: // tracing out large numbers will go into exponent notation Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: Tachikomaia en 7 Diciembre 2023, 13:59 pm Daniel:
Cierto pero en este caso no hubo división, es entero+entero y resulta decimal :o Deberías migrar a Flash MS 2004 y AS2 XD) Te cuento.Flash 5 fue el 1er Flash que tuve, no podía actualizarlo porque no tenía Internet ni contactos, ni interés porque estaba bien. Desde cierto punto empecé a usar una función "secreta" (que no recuerdo cómo averigué): "fs command (save, (nombre.extensión))" o algo así, aquí la mencionan: https://www.forosdelweb.com/f16/fscommand-447897/ También se menciona que no está incluída en los manuales, en otros lados leí que "was hacked" o algo así, por eso dije "secreta". Cuando conseguí Flash 8, no me funcionaba eso. Y me resultaba crucial. Busqué en cibercafés cómo se guardaba variables en archivos, y lo que encontré me resultó tan absurdamente complicado que decidí volver a usar el 5. Hace mucho no uso esa función, pero de hecho he visto que en nuevas versiones de Flash usan eso de Import que no me gusta y no permiten poner código en películas, que también me resultaba esencial, y aún hoy me resulta útil... Aunque puede ser por las mismas limitaciones de F5. Por ejemplo ¿cómo captas que se presionó una tecla cualquiera? De las que funcionan, Esc parece que no. Yo intenté algo como: LastKey = getcode(); Y chequear si cambia, creo que inicia como -1 pero... sólo si entraste con el mouse, sino te capta el enter, e inicia con su valor y asume que presionaste una tecla. Estoy haciendo un juego muy sencillo que se gana si presionas una tecla cualquiera, pero debo evitar el error que te mencioné xD Así lo tengo: Código: Escena 1 En F8 llegué a usar algo llamado Listener o algo así, no me acuerdo, pero me gustaba más poner acciones en objetos... Otro problema que tuve con F8 es que yo quería que me abriera los archivos con el 5 pero se me cambiaba, y al intentar desinstalarlo me decía que no tenía permiso... Por todo eso sigo prefiriendo el 5 o al menos sería arriesgado instalar otros, no los necesito. Lo que sí, tengo archivos que no puedo abrir, pero eso es cuestión de ir a un ciber algún día, e instalar algo ahí, no tengo apuro. Creo que en F5 es imposible hacer algo como esto: Si se presiona el mouse, hacer X. sino si se presiona una tecla, hacer Y. sino si se mueve el mouse, hacer Z. Porque lo 2ndo sólo se puede hacer con "onClipEvent (keyDown)" en una película como te comenté, y no se puede usar else con eso xD Entonces puede que se apliquen todos a la vez. Claro, puede ponerse los códigos en distintos frames con ifs, pero no es una forma cómoda de hacerlo, a eso me refería. Citar Código
Macromedia Flash 5 lo compila a: Código
Macromedia Flash MX 2004 lo compila a: Código
Código: Longitud = 8; Y resultó bien, entonces asumo que funciona mal cuando el programa está medio sobrecargado, al menos en mi caso, en el tuyo parece que siempre. Citar JPEXS Me lo anoto.Ah, mira, justo miré anotaciones y me acordé de algo: "Parece que no es posible cambiar el color de algo referenciándolo con eval, no puede tener un nombre variable, debe ser la película. Habrá que probar si no hay manera, si cometí un error, sino habrá que usar ifs... o functions." Aún no lo analicé mucho, son 4 cuadrados grandes puestos como si fuesen 2x2 píxeles pero que ocupan toda la pantalla. Son Pixel1, Pixel2, Pixel3 y Pixel4. La idea es que en la pantalla se generen todos los posibles dibujos con esos cambiando de color a blanco y negro nada más. Este es el código que debo arreglar: Código
Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: EdePC en 11 Diciembre 2023, 04:26 am Citar Flash 5 fue el 1er Flash que tuve, no podía actualizarlo porque no tenía Internet ni contactos, ni interés porque estaba bien. Desde cierto punto empecé a usar una función "secreta" (que no recuerdo cómo averigué): "fs command (save, (nombre.extensión))" o algo así, aquí la mencionan: https://www.forosdelweb.com/f16/fscommand-447897/ Hasta Flash 5 se usaba esa técnica, a partir de Flash 6 se eliminó esa posibilidad pero se implementó SharedObject que sirve para guardar y traer datos en Disco, es lo que se usa en juegos actuales para guardar puntuaciones, preferencias, etc. Si sabes algo de cookies en la web, pues es prácticamente lo mismo pero aplicado a flash. En sí es muy sencillo de usar, quizá has visto otros métodos que son para ActionScript 2.0 o 3.0 para manipular archivos o enviar/recibir datos a servidores web, eso si es alguito más complejo Citar Por ejemplo ¿cómo captas que se presionó una tecla cualquiera? De las que funcionan, Esc parece que no. Yo intenté algo como: LastKey = getcode(); Y chequear si cambia, creo que inicia como -1 pero... sólo si entraste con el mouse, sino te capta el enter, e inicia con su valor y asume que presionaste una tecla. Estoy haciendo un juego muy sencillo que se gana si presionas una tecla cualquiera, pero debo evitar el error que te mencioné xD Así lo tengo: No comprendo bien esa parte pero si puedes ver que tecla se presionó y actuar de acuerdo a ello, incluido el Escape, puedes ver los códigos de cada tecla con por ejemplo (recomiendo keyUp): Código
Puedes comparar Key.getCode() con el número que corresponde a alguna tecla y actuar de acuerdo a ello, por ejemplo la tecla Escape corresponde a 27 Código
Citar M, yo probé esto: Código: Longitud = 8; Nombre = "N"+Longitud; N8 = 9999999; N = eval(Nombre)+1; trace ("N: "+N); set (Nombre, eval(Nombre)+1); trace (Nombre+": "+eval(Nombre)); stop (); Y resultó bien, entonces asumo que funciona mal cuando el programa está medio sobrecargado, al menos en mi caso, en el tuyo parece que siempre. No, el problema es Math.pow() en Macromedia Flash 5, este siempre devuelve un decimal aproximado por lo que deberías usar Math.round() para compensarlo, cuando haces operaciones con esos valores aproximados pierdes todavía más precisión porque hay varios dígitos enteros y decimales con los que se debe repartir el número completo. Flash siempre hace algunos redondeos internos cuando trabaja, por ejemplo si ejecutas: Código
Devuelve: 10000000 9999999.99999999 Citar ¿El programa dice que 9999999+1 es 9999999.99999999? Entonces en realidad nunca estás sumando 9999999+1, la operación que estás haciendo es: 99999998.99999991 + 1 Lo que haces es: -1 + Math.pow(10, 8) lo cual internamente devuelve 99999998.99999991 y no el 99999999 que esperabas. Luego le sumas 1 quedando 99999999.9999999. Lo que sugería es que uses Math.round así: Código
lo que devuelve: 99999999.9999999 100000000 99999998.9999999 99999999 Título: Re: ¿El programa dice que 9999999+1 es 9999999.99999999? Publicado por: Tachikomaia en 11 Diciembre 2023, 19:04 pm se implementó SharedObject que sirve para guardar y traer datos en Disco, es lo que se usa en juegos actuales para guardar puntuaciones, preferencias, etc. Si sabes algo de cookies en la web, pues es prácticamente lo mismo pero aplicado a flash. En sí es muy sencillo de usar, quizá has visto otros métodos que son para ActionScript 2.0 o 3.0 para manipular archivos o enviar/recibir datos a servidores web, eso si es alguito más complejo Voy a buscar por curiosidad. Sí, yo había leído que había que enviar un email, supongo que leí mal, no podía creerlo :o ¡Enviar un email para guardar variables en un archivo!Citar No comprendo bien esa parte Imagina un juego que se gana por presionar cualquier tecla.Normalmente sería algo así: Código
Pero si entras al juego habiendo presionado Enter, el juego creerá que presionaste eso en él (salvo que tarde mucho en abrirse o enseguida dejes de presionar la tecla), por eso 1ero hay que chequear que ya no se esté presionando una tecla, así: Código
A mí la Esc no me funciona en eso, pero agregando tu código podría lograrlo, pruebo, pero ¿te das cuenta que hay muchas teclas que podrían tener que agregarse? Alt, ImprPant, etc. Ah, hasta me había olvidado que usé Math.pow xD Tengo pésima memoria para algunas cosas xD Ahora entiendo mejor el mensaje de .xAk. sobre agregar 0s como si fuese un string. Así que es el pow... Menos mal, sería incómodo que si uno suma un número "grande" pueda fallar, sin saber realmente qué es "grande" para Flash. |