elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ¿Error al convertir nùmero grande a binario?
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Error al convertir nùmero grande a binario?  (Leído 111 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.578


Hackentifiko!


Ver Perfil
¿Error al convertir nùmero grande a binario?
« en: Ayer a las 10:53 »

En el dibujo de arriba izquierda:

debería formarse esto:

es como una L reflejada verticalmente.
pero como ven, está mal.

Ahí hay 7*7 dibujos (cuadros) compuestos de 8*8 cuadraditos cada uno.

El problema ocurre con esos números, no ocurre con números menores como
2 y 3
3 y 4
...
6 y 7
como ven siempre pongo que CuadrosPorFila = CuadraditosPorFila-1

Creo que el problema está en cómo se genera la variable DibujoaMostrar, en esta función, que se usa al inicio y cada vez que cambian esos números:
Código
  1. function AjustarVariables () {
  2. Cuadros = CuadrosPorFila*CuadrosPorFila;
  3. MaxCuadro = Cuadros-1;
  4. Cuadraditos = CuadraditosPorFila*CuadraditosPorFila;
  5. MaxCuadradito = Cuadraditos-1;
  6. LargoDeCuadraditos = 384/(CuadraditosPorFila*CuadrosPorFila+CuadrosPorFila-1);
  7. LargoDeCuadros = CuadraditosPorFila*LargoDeCuadraditos;
  8. // Esto es para que el 1er dibujo sea una L al revés...
  9. // Se averigua su número representante en binario:
  10. // Para formar la _
  11. DibujoEnBinario = String(Math.round(Math.pow(10, CuadraditosPorFila)));
  12. // Quitar el 1:
  13. DibujoEnBinario = DibujoEnBinario.substring(1, CuadraditosPorFila+1);
  14. // Esto forma las filas siguientes, con el 1ero pintado:
  15. NroDelCaracter = Cuadraditos-CuadraditosPorFila;
  16. AnterioraPintar = MaxCuadradito-CuadraditosPorFila;
  17. do {
  18. NroDelCaracter--;
  19. if (NroDelCaracter != AnterioraPintar) {
  20. DibujoEnBinario = 1+DibujoEnBinario;
  21. } else {
  22. DibujoEnBinario = 0+DibujoEnBinario;
  23. AnterioraPintar = AnterioraPintar-CuadraditosPorFila;
  24. }
  25. } while (NroDelCaracter>0);
  26. // trace("DibujoEnBinario que hace la L invertida: "+DibujoEnBinario);
  27. // Convertirlo en decimal:
  28. DibujoaMostrar = 0;
  29. do {
  30. DibujoaMostrar = DibujoaMostrar+(Number(DibujoEnBinario.charat(NroDelCaracter))*Math.pow(2, DibujoEnBinario.length-1-NroDelCaracter));
  31. NroDelCaracter++;
  32. } while (NroDelCaracter<Cuadraditos);
  33. DibujoaMostrar = Number(DibujoaMostrar);
  34. trace("DibujoaMostrar calculado desde la L invertida: "+DibujoaMostrar);
  35. }

Porque tengo una función que convierte DibujoaMostrar a binario y...

Si CuadroPorFila es 2 y CuadraditosPorFila es 3, la conversión dice:
Convirtiendo a binario esto: 432
DibujoEnBinario: 110110000
y está bien, vean que tiene 4 0s al final. Los dibujos se muestran al revés a eso, o sea:
000
011
011
y 0 es negro, vean que se forma la ┌
son 3 0s y uno más que sigue en la siguiente fila. 4.

Si pongo 3 y 4:
Convirtiendo a binario esto: 61152
DibujoEnBinario: 1110111011100000
5 0s, la cantidad de 0s aumentó 1.

Con 4 y 5:
Convirtiendo a binario esto: 32472000
DibujoEnBinario: 1111011110111101111000000
6, de nuevo aumentó 1.

5 y 6:
Convirtiendo a binario esto: 67628691328
DibujoEnBinario: 111110111110111110111110111110000000
7, de nuevo +1.

6 y 7:
Convirtiendo a binario esto: 558517276622592
DibujoEnBinario: 1111110111111011111101111110111111011111100000000
8, de nuevo +1.

7 y 8:
Convirtiendo a binario esto: 1.83744039008715e+19
DibujoEnBinario: 1111111011111110111111101111111011111110111111110000000000000000
Con esto ocurre el problema. Vean que en 1er lugar el número se muestra raro, y el binario en vez de tener 9 0s al final tiene 16.
Creo haber confirmado que la función que convierte a binario no es el problema, falla porque se le da ese número raro.

¿Se puede corregir el error o es un número muy largo y por eso fallará sí o sí?

Explico por qué uso números grandes:
Supongan que el programa calcula cuántos dibujos pueden formarse con las condiciones dadas. Siendo 8*8 cuadraditos, si mal no recuerdo el cálculo es 2^64, que en la calculadora dice que es:
18446744073709551616
ese número convertido a binario forma lo que sería el dibujo todo pintado, con uno 1 delante que sobra:
10000000000000000000000000000000000000000000000000000000000000000
se vería así si quitamos el 1:
00000000
00000000
00000000
00000000
00000000
00000000
00000000
00000000
son 8*8 0s.

Supongan que esa cantidad la queremos dividir entre 7, para que cada cuadro muestre la misma cantidad de esos posibles dibujos a lo largo de cierto tiempo.
El cuadro nro 1 mostrará los 1eros 1000 dibujos posibles, por decir algo, el 2ndo los siguientes, y así.

Básicamente por eso es que necesito los números grandes. A la cantidad de dibujos posible le voy restando la cantidad que va a mostrar cada cuadro, para saber qué dibujo se mostrará 1ero en cada cuadro. Eso no lo puse en el código aquí porque no creo que sea el problema.

¿Hay alguna otra cosa importante que deba decir sobre esto?

La conversión es:
Código
  1. function ConvertiraBinario (numero) {
  2. // trace("Convirtiendo a binario esto: "+numero);
  3. // Averiguar cómo es en binario:
  4. DibujoEnBinario = "";
  5. while (numero>0) {
  6. DibujoEnBinario = numero%2+DibujoEnBinario;
  7. numero = Math.floor(numero/2);
  8. }
  9. // Agregar 0s a DibujoEnBinario si hacen falta:
  10. while (DibujoEnBinario.length<Cuadraditos) {
  11. DibujoEnBinario = 0+DibujoEnBinario;
  12. }
  13. // trace("DibujoEnBinario: "+DibujoEnBinario);
  14. }


« Última modificación: Ayer a las 10:59 por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] e^x, si x es grande, numero negativo
Programación C/C++
edr89 9 5,990 Último mensaje 7 Junio 2013, 05:31 am
por leosansan
numero hexadecimal grande
Java
m@o_614 1 1,987 Último mensaje 21 Enero 2015, 07:14 am
por 3n31ch
Como convertir un numero a binario y usar nibbles.
ASM
Castiel 2 4,139 Último mensaje 10 Agosto 2015, 07:54 am
por Castiel
Leer un numero muy grande
Programación C/C++
mendez1415 1 2,204 Último mensaje 26 Noviembre 2016, 18:07 pm
por engel lex
Error convertir numero a letras
PHP
pompyarro 5 3,530 Último mensaje 17 Agosto 2017, 15:28 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines