Autor Tema: Especificar límites correctamente.

0 Usuarios y 1 Visitante están viendo este tema.

23 Septiembre, 2024, 05:56 am
Leído 573 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Relacionado con mi programa que muestra números cada vez más largos.

Al principio, son de largo 1, son positivos de 0 decimales, y el límite es 9, porque luego viene el 10 y ese tiene largo 2. Límite significa que a partir de ese número ya no deben producirse más de ese tipo.

Luego empiezan los de largo 2, ahora hay 2 tipos de número: Negativos y positivos.
El límite de los negativos es -9, porque el siguiente avanzando desde el 0 (o sea restando) es -10, que es de largo 3 (el - es parte del largo).
El límite de los positivos es 99.

Ahora que empiezan los de largo 3 los positivos pueden tener 0 decimales o 1. El . cuenta en el largo.
Los límites son:
Para positivos de 0: 999
Para los negativos: -99
Para los decimales: 99 porque los guardo como enteros, eso se debe interpretar como 9.9, o sea se divide entre 10 1 vez, donde 1 es la cantidad de decimales.

Cuando empiezan los de largo 4, los límites serán:
MaxPositivoDe0 = 9999;
MaxNegativoDe0 = -999;
MaxPositivoDe1 = 999;
MaxNegativoDe1 = -99;
MaxPositivoDe2 = 999;
Entiéndase que Max se refiere al último, lo que pasa que ya tengo variables así con Last delante.

Bueno... ¿cual es la matemática detrás de esto? O sea, a partir de acá se crean 2 tipos de número ¿cómo se definen los límites? ¿cual es la fórmula? Si largo es L ¿cual será el límite de MaxPositivoDe0? 10^L-1 creo ¿y para los demás?
Si digo MaxPositivoDeY ¿cómo es la fórmula del límite, a partir de L e Y?
¿Y MaxNegativoZ? ¿cómo es la fórmula del límite, a partir de L y Z?

Hice este código pero no sé si funciona bien porque con tanto lío que tuve aún no probé esta parte:
Código: [Seleccionar]
// Indicar nuevos máximos:
MaxPositivoDe0 = Math.pow(10, Decimales+1)-1;
MaxNegativoDe0 = Math.pow(10, Decimales)*-1+1;
Decimales = 0;
Maximo1 = Math.pow(10, Decimales)-1;
Maximo2 = Math.pow(10, Decimales-1)*-1+1;
do {
Decimales++;
set ("MaxPositivoDe"+Decimales, Maximo1);
set ("MaxNegativoDe"+Decimales, Maximo2);
} while (Decimales<MaxDecimales);
}
¿Les parece que está bien? Yo en este momento no lo entiendo, luego intentaré, pero si lo entienden y me lo pueden explicar, mejor.

23 Septiembre, 2024, 07:37 am
Respuesta #1

feriva

  • $$\Large \color{#a53f54}\pi\,\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 12,032
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
Relacionado con mi programa que muestra números cada vez más largos.

Al principio, son de largo 1, son positivos de 0 decimales, y el límite es 9, porque luego viene el 10 y ese tiene largo 2. Límite significa que a partir de ese número ya no deben producirse más de ese tipo.


Es muy complicado esa forma de hacerlo. Considera esto:

El ordenador no trabaja con infinitas cifras, evidentemente, entonces podrás establecer una cantidad máxima de cifras; las que tú consideres, cien o mil o las que sean. A partir de eso, creas una variable que sea una lista o matriz, o también puede ser una variable alfanumérica, lo que se dice una palabra con código “str” (con números, pero una palabra en cuanto a código) que después puedas convertir a número (eso se lo puedes preguntar a la IA; si lo quieres hacer con actionscrpit, ahora mismo no sé cómo es en ese lenguaje).

Entonces, tu palabra o matriz será algo así [0,000000], con la cantidad de cifras que quieras.

El lenguaje tiene una orden para extraer el primer cero, cambiarlo por otro dígito y tal, lo cual puede realizar con ayuda de un bucle. El último cero va tomando valores 1,2,3... y cuando llega a 9 pasa a cero, es cíclico, todo es programar esa rutina (ayúdate con la IA para hacer el código, que para eso se ha inventado).

En el momento en que llega a cero otra vez, ocurre lo mismo con el antepenúltimo, y así sucesivamente. De esta manera los números van siendo más grandes en valor absoluto. Con este sistema cíclico va a haber números así

[1,000000]

[2,000000]

...

[9,000000]

(o con la cantidad de cifras que tú quieras)

que serán los números enteros. sin decimales.

Esto es así como digo, si tú restas en una calculadora 3,000 - 3 te da cero; siempre que un número tiene una cantidad de ceros detrás de la coma, si no aparecen más que cero, entonces se entiende que es un entero; lo entienden lo mismo las personas que las calculadoras.

Saludos.

26 Septiembre, 2024, 12:38 am
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Los números que mi programa produce, si tienen parte decimal ella no termina en 0, no me interesa el 30.000 porque es como un 30. En cambio 30.001 sí es admitido. La parte decimal no debe terminar en 0.

Ya hice lo que quería, sólo necesito marcar el límite correctamente como ya expliqué.

Este es el código completo, cada etapa (y función) se repite en distintos frames hasta que ella misma indique que se debe avanzar a la siguiente:
Código: [Seleccionar]
// Este programa produce números cada vez más largos,
// intercalándolos según el tipo,
// entre más decimales 1ero,
// y secundariamente los negativos 1ero.
//
// El 0 aquí se refiere a la cantidad de decimales
// (pero los números se guardan como enteros):
LastPositivoDe0 = -1;
// El programa tiene 5 etapas:
// 1: Esta, donde sólo se definen cosas.
// 2: Produce el 0 y números positivos de 0 decimales.
// 3: Negativos y positivos, de 0 decimales.
// 4: Positivos de 1, negativos y positivos de 0.
// 5: Va creando 2 tipos de número.
// Variables como esta determinan cuánto dura cada etapa,
// o cuando se crean listas y sus máximos valores:
MaxPositivoDe0 = 9;
// Esto se repite en el frame 2:
function Etapa2 () {
// Producir el 0 o un número positivo:
LastPositivoDe0++;
trace (LastPositivoDe0);
if (LastPositivoDe0 == MaxPositivoDe0) {
// No hay más números de largo 1,
// crear lista de negativos:
LastNegativoDe0 = 0;
// Indicar nuevos máximos:
MaxPositivoDe0 = 99;
MaxNegativoDe0 = -9;
// Avanzar etapa:
gotoAndStop (3);
}
}
// Esto se repite en el frame 3:
function Etapa3 () {
// ¿Se puede producir un número negativo de largo 2?
if (LastNegativoDe0>MaxNegativoDe0) {
// Sí, producirlo:
LastNegativoDe0--;
trace (LastNegativoDe0);
}
// Positivo:
LastPositivoDe0++;
trace (LastPositivoDe0);
if (LastPositivoDe0 == MaxPositivoDe0) {
// No hay más números de largo 2.
// crear lista de positivos de 1 decimal:
LastPositivoDe1 = 0;
// Indicar nuevos máximos:
MaxPositivoDe0 = 999;
MaxNegativoDe0 = -99;
// Recuérdese que las listas de decimales...
// son guardadas como enteros.
MaxPositivoDe1 = 99;
// Avanzar etapa:
gotoAndStop (4);
}
}
// Esto se repite en el frame 4:
function Etapa4 () {
// ¿Se pueda producir un número positivo de 1 decimal y largo 3?
if (LastPositivoDe1<MaxPositivoDe1) {
// Sí, producirlo:
LastPositivoDe1++;
// ¿Termina en 0?:
Textualizado = String(LastPositivoDe1);
LastChar = Textualizado.charat(Textualizado.length-1);
if (LastChar == 0) {
// Sí, ergo al convertirlo a decimales...
// no tendrá largo 3, arreglarlo:
LastPositivoDe1++;
}
Decimaleado = LastPositivoDe1/10;
trace (Decimaleado);
}
// ¿Se puede producir un número negativo de largo 3?
if (LastNegativoDe0>MaxNegativoDe0) {
// Sí, producirlo:
LastNegativoDe0--;
trace (LastNegativoDe0);
}
// Positivo:
LastPositivoDe0++;
trace (LastPositivoDe0);
if (LastPositivoDe0 == MaxPositivoDe0) {
// No hay más números de largo 3,
// crear nuevas listas:
LastPositivoDe2 = 0;
LastNegativoDe1 = 0;
// Indicar nuevos máximos:
MaxPositivoDe0 = 9999;
MaxNegativoDe0 = -999;
MaxPositivoDe1 = 999;
MaxNegativoDe1 = -99;
MaxPositivoDe2 = 999;
// Para la siguiente etapa:
MaxDecimales = 2;
Decimales = 2;
trace ("Inicia la 5");
gotoAndStop (5);
}
}
// Esto se repite en el frame 5:
function Etapa5 () {
// ¿Se puede producir un número positivo de X decimales y largo Y?
// X = Decimales.
Resumen = "LastPositivoDe"+Decimales;
// trace("Resumen: "+Resumen);
Evalued = eval(Resumen);
// trace("Evalued: "+Evalued);
if (Evalued<eval("MaxPositivoDe"+Decimales)) {
// Sí, producirlo:
Evalued++;
// ¿Termina en 0?:
Textualizado = String(Evalued);
LastChar = Textualizado.charat(Textualizado.length-1);
if (LastChar == 0) {
// Sí, ergo al convertirlo a decimales...
// no será del largo requerido, arreglarlo:
Evalued++;
}
Decimaleado = Evalued/Math.pow(10, Decimales);
trace (Decimaleado);
// Guardarlo en la lista:
set (Resumen, Evalued);
}
do {
// Repetir mientras Decimales > 0:
Decimales--;
// ¿Se puede producir un número negativo de X decimales y largo Y?
Resumen = "LastNegativoDe"+Decimales;
// trace("Resumen: "+Resumen);
Evalued = eval(Resumen);
// trace("Evalued: "+Evalued);
if (Evalued>eval("MaxNegativoDe"+Decimales)) {
// Sí, producirlo:
Evalued--;
if (Decimales>0) {
// ¿Termina en 0?:
Textualizado = String(Evalued);
LastChar = Textualizado.charat(Textualizado.length-1);
if (LastChar == 0) {
// Sí, ergo al convertirlo a decimales...
// no será de largo Y, arreglarlo:
Evalued--;
}
}
Decimaleado = Evalued/Math.pow(10, Decimales);
trace (Decimaleado);
// Guardarlo en la lista:
set (Resumen, Evalued);
}
// ¿Se puede producir un número positivo de X decimales y largo Y?
// X = Decimales.
Resumen = "LastPositivoDe"+Decimales;
// trace("Resumen: "+Resumen);
Evalued = eval(Resumen);
// trace("Evalued: "+Evalued);
if (Evalued<eval("MaxPositivoDe"+Decimales)) {
// Sí, producirlo:
Evalued++;
if (Decimales>0) {
// ¿Termina en 0?:
Textualizado = String(Evalued);
LastChar = Textualizado.charat(Textualizado.length-1);
if (LastChar == 0) {
// Sí, ergo al convertirlo a decimales...
// no tendrá largo Y, arreglarlo:
Evalued++;
}
}
Decimaleado = Evalued/Math.pow(10, Decimales);
trace (Decimaleado);
// Guardarlo en la lista:
set (Resumen, Evalued);
}
if (LastPositivoDe0 == MaxPositivoDe0) {
// INDICAR SI CONTINÚA O PARA:
// No hay más números de largo Y.
// crear listas para números más largos:
MaxDecimales++;
set ("LastPositivoDe"+MaxDecimales, 0);
set ("LastNegativoDe"+MaxDecimales, 0);
// Indicar nuevos máximos:
MaxPositivoDe0 = Math.pow(10, Decimales+1)-1;
MaxNegativoDe0 = Math.pow(10, Decimales)*-1+1;
Decimales = 0;
Maximo1 = Math.pow(10, Decimales)-1;
Maximo2 = Math.pow(10, Decimales-1)*-1+1;
do {
Decimales++;
set ("MaxPositivoDe"+Decimales, Maximo1);
set ("MaxNegativoDe"+Decimales, Maximo2);
} while (Decimales<MaxDecimales);
}
} while (Decimales>0);
Decimales = MaxDecimales;
}

El resultado en pantalla cuando empieza la etapa 5 es:
0.01
-0.1
10.1
-100
1000
0.02
-0.2
10.2
-101
1001
y sigue así.