Autor
|
Tema: ¿El programa dice que 9999999+1 es 9999999.99999999? (Leído 6,889 veces)
|
Tachikomaia
Conectado
Mensajes: 1.460
Hackentifiko!
|
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: Escena 1 actions for fotograma 1 MinLongitud = 1; MaxLongitud = 1; N1 = -1; actions for fotograma 2 Longitud = MinLongitud; trace ("F2: Longitud: "+Longitud); actions for fotograma 4 Nombre = "N"+Longitud; trace ("Nombre: "+Nombre); N = eval(Nombre)+1; trace ("N: "+N); if (String(N).length>Longitud) { trace (String(N).length+" > "+Longitud); // El valor ya fue producido. MinLongitud = MinLongitud+1; trace ("MinLongitud: "+MinLongitud); gotoAndPlay (2); } else { // Guardar el valor en la lista correspondiente. set (Nombre, N); trace ("Se generó "+Nombre+": "+N); C = String(N).charat(N); // trace (N+" resulta "+C); if (C == 0) { if (Solfor0 == undefined) { Solfor0 = N; } } else if (C == -9) { if (Solfor9 == undefined) { Solfor9 = N; } } else if (C == 4.5) { if (Solfor4 == undefined) { Solfor4 = N; } } else if (C == -7.2) { if (Solfor7 == undefined) { Solfor7 = N; } } } actions for fotograma 5 if (Longitud<MaxLongitud) { Longitud = Longitud+1; gotoAndPlay (4); } else { // Se creará una nueva lista. MaxLongitud = MaxLongitud+1; set ("N"+MaxLongitud, -1+Math.pow(10, MaxLongitud-1)); trace ("Se creó N"+MaxLongitud+": "+String(-1+Math.pow(10, MaxLongitud-1))); gotoAndPlay (2); }
Salida: 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: Nombre = "N"+Longitud; N = eval(Nombre)+1;
El resultado es: 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?
|
|
« Última modificación: 5 Diciembre 2023, 10:20 am por Tachikomaia »
|
En línea
|
|
|
|
D3s0rd3n
Desconectado
Mensajes: 97
Tu Mente es mi arma. Entregame tu mente
|
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.
|
|
|
En línea
|
Gobiernos del Mundo Industrial, ustedes, cansados gigantes de carne y acero vengo del Ciberespacio, el nuevo hogar de la Mente. En nombre del futuro, les pido en el pasado que nos dejen en paz. No son bienvenidos entre nosotros. No tienen ninguna soberania sobre el lugar donde nos reunimos.
|
|
|
Tachikomaia
Conectado
Mensajes: 1.460
Hackentifiko!
|
Pero estos números son enteros, se convierten a decimal sin que haya habido decimales de por medio.
|
|
|
En línea
|
|
|
|
Danielㅤ
Desconectado
Mensajes: 1.853
🔵🔵🔵🔵🔵🔵🔵
|
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
|
|
|
En línea
|
|
|
|
EdePC
|
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() 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: trace( -1 + Math.pow(10, 8 - 1) )
Macromedia Flash 5 lo compila a: trace(9999998.999999994);
Macromedia Flash MX 2004 lo compila a: trace(9999999);
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: trace( Math.Round(-1 + Math.pow(10, 8 - 1)) )
--- 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
|
|
|
En línea
|
|
|
|
D3s0rd3n
Desconectado
Mensajes: 97
Tu Mente es mi arma. Entregame tu mente
|
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.
|
|
|
En línea
|
Gobiernos del Mundo Industrial, ustedes, cansados gigantes de carne y acero vengo del Ciberespacio, el nuevo hogar de la Mente. En nombre del futuro, les pido en el pasado que nos dejen en paz. No son bienvenidos entre nosotros. No tienen ninguna soberania sobre el lugar donde nos reunimos.
|
|
|
|
Tachikomaia
Conectado
Mensajes: 1.460
Hackentifiko!
|
Daniel: Cierto pero en este caso no hubo división, es entero+entero y resulta decimal 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: Escena 1 // En el fotograma 1 y 2 dice "Cargando..." actions for Vacío (fotograma 2) onClipEvent (keyDown) { _level0.gotoAndPlay(1); } // En fotograma 3 y 4 se muestra mensaje "Presiona una tecla". actions for fotograma 4 gotoAndPlay (3); actions for Vacío (fotograma 3 y 4) onClipEvent (keyDown) { // Muestra mensaje "Ganaste". _level0.gotoAndStop(5); } 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. trace( -1 + Math.pow(10, 8 - 1) )
Macromedia Flash 5 lo compila a: trace(9999998.999999994);
Macromedia Flash MX 2004 lo compila a: trace(9999999);
M, yo probé esto: 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. 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: Escena 1 actions for fotograma 1 Puntero = 4; function Variar () { Pixel = "P"+Puntero; evaledPixel = eval(Pixel); // ¿El pixel puede cambiar de color? if (evaledPixel<1) { // Sí, cambiarlo. set (Pixel, evaledPixel+1); Col = new Color(evaledPixel); Col.setRGB(parseInt(FFFFFF, 16)); DibujoListo = "Sí"; gotoAndPlay (4); // Darme tiempo de verlo // volver } else { // No, resetearlo. set (Pixel, 0); Col = new Color(evaledPixel); Col.setRGB(parseInt(0, 16)); // ¿Hay un pixel anterior? if (Puntero>1) { // Sí, apuntar a ese. Puntero = Puntero-1; // Continuar haciendo el dibujo. DibujoListo = "No"; } } } actions for fotograma 2 Variar(); actions for fotograma 3 Variar(); if (DibujoListo == "No") { gotoAndPlay (2); } actions for fotograma 20 gotoAndPlay (2);
|
|
« Última modificación: 7 Diciembre 2023, 14:15 pm por Tachikomaia »
|
En línea
|
|
|
|
EdePC
|
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 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): onClipEvent (keyUp) { trace (Key.getCode()); }
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 onClipEvent (keyUp) { if (Key.getCode() == 27) { trace ("Usted a presionado Escape"); } }
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: trace(9999999.999999999) trace(9999999.999999994)
Devuelve: 10000000 9999999.99999999¿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 + 1Lo 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í: trace( Math.pow(10,8) ) trace( Math.round(Math.pow(10,8)) ) trace( -1 + Math.pow(10,8) ) trace( -1 + Math.round(Math.pow(10,8)) )
lo que devuelve: 99999999.9999999 100000000 99999998.9999999 99999999
|
|
|
En línea
|
|
|
|
Tachikomaia
Conectado
Mensajes: 1.460
Hackentifiko!
|
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 ¡Enviar un email para guardar variables en un archivo! No comprendo bien esa parte Imagina un juego que se gana por presionar cualquier tecla. Normalmente sería algo así: actions for fotograma 1 // Mostrar mensaje "Presiona una tecla." stop (); actions for Movie1 onClipEvent (keyDown) { _level0.gotoAndStop(2); } actions for fotograma 2 // Mostrar mensaje "Ganaste."
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í: // Desde frames 1 a 3 mostrar mensaje "Presiona una tecla." actions for Movie1 (ubicada desde frame 1 a 3) onClipEvent (keyDown) { _level0.gotoAndPlay(2); } actions for fotograma 4 stop (); actions for Movie2 onClipEvent (keyDown) { _level0.gotoAndStop(5); // Ahí se muestra mensaje "Ganaste". }
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.
|
|
« Última modificación: 11 Diciembre 2023, 19:07 pm por Tachikomaia »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
programa en c++ el programa me da un error dice que la llave correspondiente a {
Programación C/C++
|
eduardo17445
|
2
|
4,819
|
5 Junio 2012, 19:51 pm
por eduardo17445
|
|
|
[Pedido] Programa que lee puntuaciones y te dice la mas alta.
Programación C/C++
|
copinsa
|
3
|
2,121
|
18 Noviembre 2013, 16:00 pm
por rir3760
|
|
|
que programa me dice los controladores que necesito
Hardware
|
4rm4ndo
|
2
|
2,661
|
26 Octubre 2019, 00:53 am
por 4rm4ndo
|
|
|
Hay un programa que no puedo abrir dice: Este programa no se puede abrir porque el administrador lo ha impedido!
Windows
|
win_7
|
8
|
9,052
|
23 Mayo 2021, 18:50 pm
por Serapis
|
|
|
El S.M.A.R.T. del disco me dice GOOD, pero el programa Victoria me dice UNIDEAL
« 1 2 »
Hardware
|
Alcahez
|
12
|
16,651
|
11 Octubre 2022, 11:37 am
por el-brujo
|
|