Autor Tema: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)  (Leído 9500 veces)

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

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #15 en: 09 de Febrero de 2010, 10:34:57 »
A lo mejor la pregunta inicial está mal planteada. Parece que la pregunta debería ser: Dado un número de n bits de longitud ¿como se pueden obtener los dígitos de la cifra decimal equivalente, uno a uno?  :shock:
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #16 en: 09 de Febrero de 2010, 10:54:54 »
Ahí está Diego, complicando el asunto... jejeje

Jesús, como q no está definido? qué versión usas? en la última, aparece en la ayuda, he probado a hacer una suma y comerselo se lo come, el código que aparece en ASM pudiera ser cierto (aunque no lo he comprobado)... ahora el que me he perdido he sido yo!

Edito:

PD, PD, PD... en la prueba estaba usando un dspic ya que andaba trabajando con uno... y por eso será que me ha compilado. Por lo que dice CCS los Pic24 y los Dspic si que soportan los 64bits:
http://www.ccsinfo.com/content.php?page=PIC24-dsPIC-features&navcode=/rhCFeatures24

No pasa con los demás:
http://www.ccsinfo.com/content.php?page=overview&navcode=/rhCFeatures10

Respondido me hayo...
« Última modificación: 09 de Febrero de 2010, 10:59:21 por J1M »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #17 en: 09 de Febrero de 2010, 10:57:43 »
En la 4.093 no aparece. int64 tira el error de Undefined identifier.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #18 en: 09 de Febrero de 2010, 11:01:45 »
Es que a veces me voy a la parra y ni me doy cuenta, mira el 'edito' que he añadido.

'Me se' pasa la pasta! XDD aioooss

Desconectado aitopes

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5100
    • uControl
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #19 en: 09 de Febrero de 2010, 11:05:34 »
Hola Diego!
Que problema "peliagudo".  :5]

Pensando en voz alta: cada 4 digitos binarios tienes uno en decimal. Tu chorizo de 40 digitos son 10 digitos Hexa. ¿No te es mas facil trabajarlos (al menos mentalmente) de esa forma? (creo que no, pero por ahi te da alguna idea).

Existe un algoritmo que se llama algo asi como "recorre y suma 3" que podria aplicarse a este problema. En el link que te pongo ( http://www.engr.udayton.edu/faculty/jloomis/ece314/notes/devices/binary_to_BCD/bin_to_BCD.html) está bastante explicado.

Asi convertirias FF a 255


Es una idea nomas...pensando en voz alta  :lol:
Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert

Desconectado erdanieee

  • PIC10
  • *
  • Mensajes: 44
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #20 en: 09 de Febrero de 2010, 11:14:20 »
Buenas RedPic,

he estado dándole vueltas y al final era más sencillo de lo que parecía. Pero primero necesitas crear con un programa externo una matriz de 40x13 (número de bits a convertir por número de dígitos de 2^40), de forma que en las filas tengas el número 2^n (n de 0 a 40) separado en unidades, decenas, centenas, ... y en cada columna coincidan todas las unidades, decenas, ... Lo explico mejor con un ejemplo. Si quisieras convertir un número de 8 bits (en vez de 40) la matriz sería esta:

m = {
        {0,0,1},    //2^0
   {0,0,2},   //2^1
   {0,0,4},   //2^2
   {0,0,8},   //2^3
   {0,1,6},   //2^4
   {0,3,2},   //2^5
   {0,6,4},   //2^6
   {1,2,8}      //2^7   
     }

ahora el resto es sencillo. Para hayar las unidades del 10000111, sumaremos todas las unidades de nuestra matriz, excepto de aquellas que correspondan a un cero y nos quedamos con las unidades del resultado. El exceso se acumula para las decenas...

m = {    {0,0,1},    1
   {0,0,2},   1
   {0,0,4},   1
   {0,0,8},   0
   {0,1,6},   0
   {0,3,2},   0
   {0,6,4},   0
   {1,2,8}      1
     }

unidades = 1 + 2 + 4 + 8 = 15
decenas  = 0 + 0 + 0 + 2 + 1 = 3
centenas = 0 + 0 + 0 + 1 = 1

Y efectívamente, el 10000111 en binario corresponde al 135 en decimal.

Espero te sirva.
saludos!!

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #21 en: 09 de Febrero de 2010, 11:36:13 »
Hola Red, lo que necesitas es implementar matematica de multiprecisión. Para convertir el numero deberas aplicar sucesivamente la division de multiprecisión entre el numero y 10, cada digito ASCII es el resto de la operación, esto se hace de manera similar a como lo harias con lapiz y papel. Lamentablemente en la mayoria de los casos estas funciones son implementadas en assembler. Una excelente referencia es el libro de Knuts Tomo 1.

Saludos !

Desconectado droky

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 628
    • Diseños radikales libres
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #22 en: 09 de Febrero de 2010, 12:23:48 »
Hola,
Si tienes capacidad de proceso, te planteo la solución de sumar en papel.
Coges tu ristra y conviertes a decimal los primeros 32 bits ( hasta aquí el CCS opera)
Ahora te quedan los 8 restantes bits hasta los 40 bits de tu necesidad.
Haz una suma "ASCII".
Supón que tu dato es:
01000001-11111111111111111111111111111111
En un string tienes "2147483648" que es tu valor de los primeros 32 bits a decimal-ASCII
Y tienes que sumarle:
2^32 = 4294967296
2^33 = 8589934592
2^34 = 17179869184
2^35 = 34359738368
2^36 = 68719476736
2^37 = 137438953472
2^38 = 274877906944
2^39 = 549755813888
dependiendo de si el bit correspondiente (32-39) es 1 ó 0.
Como con las funciones de seno y coseno, implementas una tabla, pero en este caso con los dígitos ASCII de los valores de 2^32 hasta 2^39 o haces unos arrays, como prefieras en RAM o en ROM.
Entonces tu dato es:
01000001-11111111111111111111111111111111

b0-b31=11111111111111111111111111111111 = 2147483648 en decimal que lo guardas en una variable tipo var1[32]="2147483648"
b32 = 1? sí. Hacemos la suma "ASCII" de "4294967296" con "2147483648" .
Cogemos el valor decimal del ASCII var1[0] ( que es var[0]-30 ) , se lo sumas al m[0] de m[]="4294967296" y la llevada te la guardas para la siguiente    cifra. Esto lo implementas en un bucle muy sencillo con una variable para la llevada. Al terminar, te quedará en el array resultado[]="6442450944" que vas a seguir "sumando en ASCII"
b33=1? no, seguimos
b34=1? no, seguimos
b35=1? no, seguimos
b36=1? no, seguimos
b37=1? no, seguimos
b38=1? sí. Hacemos la suma "ASCII" de "6442450944" con "274877906944" .
b39=1? no, terminamos. En resultado[] tenemos un array ASCII de valor resultado[]="281320357888"

Coste máx. de la operación 12*8 sumas =96 operaciones de suma de 8 bits y 8 comparaciones
Si implementas la tabla en ROM son 96 posiciones de ROM y necesitas 2 arrays de 12 bytes en RAM para hacer la suma ASCII

El método es el mismo que dibujar los números en un papel en una columna y sumarlos cifra a cifra. Mentalmente conviertes el dígito en su valor decimal y aquí el valor ASCII en su valor decimal (ya sabemos, restando 30 )
Espero haber sido claro.
Salu2

« Última modificación: 09 de Febrero de 2010, 12:27:20 por droky »
Yo... he visto cosas que vosotros no creeríais... atacar naves en llamas más allá de Orión, he visto rayos C brillar en la oscuridad cerca de la puerta Tannhäuser.
Todos esos momentos se perderán en el tiempo como lágrimas en la lluvia.
Es hora de morir.

Si me buscas en twitter, me tienes por @radikaldesig

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #23 en: 09 de Febrero de 2010, 12:33:39 »
¡Geniales!, me encantan los métodos de Droky y erdanieee.

¡Estoy oxidado!  :(

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #24 en: 09 de Febrero de 2010, 17:19:03 »
¡Guau! ¡Guau! ¡Guau!  :) :) :)

erdanieee, droky y los demás amigos: sabía que podía confiar en ustedes.

Voy a intentar implementar un test con el método de dorky a ver si no me consume mucha ROM ...

Añado: Veo muchas posibilidades en lo que Droky llama Suma "ASCII" ...  :mrgreen:
« Última modificación: 09 de Febrero de 2010, 17:33:04 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #25 en: 09 de Febrero de 2010, 17:35:39 »
Diego:
Es el codigo de una tarjeta magnética o un touch lo que intentas sacar por el puerto??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #26 en: 09 de Febrero de 2010, 17:38:00 »
Si, Marcos, es el código de una Tarjeta Prox. de 125 Khz que me da 40 bits como código.
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #27 en: 09 de Febrero de 2010, 17:42:42 »
El codigo de los Ibutton de cuantos bits es??
En el ejemplo de CCS tendrias como hacerlo mas facil si es parecido en longitud... :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #28 en: 09 de Febrero de 2010, 19:21:40 »
Hola

Podría hacerse un truco... convencer a PCH (pic18) de que las variables int64 existen. Las definiciones vienen dadas en el archivo stdint.h.

Código: [Seleccionar]
#if defined(__PCD__)
//#define INT_LEAST24_MAX  (8388607)
//#define INT_LEAST24_MIN  (-8388608)
//#define UINT_LEAST24_MAX (16777215)

#define INT_LEAST64_MAX  (9223372036854775807)
#define INT_LEAST64_MIN  (-9223372036854775808)
#define UINT_LEAST64_MAX (18446744073709551615)
#endif

Habría que ver si PCH está preparado para manejar valores tan grandes.

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: ¿Como estáis de aritmética de mas de 32 bits? (En CCS)
« Respuesta #29 en: 16 de Febrero de 2010, 22:54:36 »

Cogemos el valor decimal del ASCII var1[0] ( que es var[0]-30 ) , se lo sumas al m[0] de m[]="4294967296" y la llevada te la guardas para la siguiente    cifra.
........

Mentalmente conviertes el dígito en su valor decimal y aquí el valor ASCII en su valor decimal (ya sabemos, restando 30 )
Espero haber sido claro.
Salu2



no entendia eso de convertir el valor ASCII de la variable, el truco esta en que es un string!

se supone entonces que el resultado va a quedar en una cadena de caracteres??

que me dicen de migsantiago?? seria asi de simple? engañando al compilador modificando el archivo stdint.h???

salu2
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!


 

anything