Autor Tema: Enteros de 64 bits?  (Leído 1388 veces)

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

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Enteros de 64 bits?
« en: 31 de Octubre de 2007, 09:32:51 »
Hola gente del foro, tengo un dilema a ver si me pueden dar una mano.
En un sistema necesitaba realizar los calculos para obtener:
-De una fecha (dia mes año), la cantidad de dias que significa.
-De una cantidad de dias especifica, la fecha en dia mes año.

Los algoritmos los tengo, son estos:

De fecha (en un entero representado por ejemplo 1/10/2007 en 11007) a dias
Código: [Seleccionar]
long TIMER_FECHA_A_DIA (long TIMER_DMA)
{long TIMER_ANO,TIMER_MES,TIMER_DIA;
 TIMER_0_H_M_S(TIMER_DMA,&TIMER_DIA,&TIMER_MES,&TIMER_ANO);//Tomo por separado el dia mes y año
 TIMER_ANO+=2000;    //Tomo años a partir del 2000 solamente!!!!
 TIMER_MES=(TIMER_MES+9)%12;
 TIMER_ANO=TIMER_ANO-(TIMER_MES/10);
 TIMER_DIA=TIMER_DIA+(365*TIMER_ANO)+(TIMER_ANO/4)-(TIMER_ANO/100)+(TIMER_ANO/400)+((TIMER_MES*306 + 5)/10)-1;
 return TIMER_DIA;
}

Y aca es donde viene el problema, de dia a fecha

Código: [Seleccionar]
long TIMER_DIA_A_FECHA (long TIMER_DIAS)
{long TIMER_ANO,TIMER_MES,TIMER_MES2,TIMER_DIA;signed long TIMER_DIA2;
 TIMER_ANO =((10000*TIMER_DIAS)+14780)/3652425;
 TIMER_DIA2 = TIMER_DIAS-((365*TIMER_ANO)+(TIMER_ANO/4)-(TIMER_ANO/100)+(TIMER_ANO/400));
 if (TIMER_DIA2 < 0)
{TIMER_ANO-=1;
TIMER_DIA2 = TIMER_DIAS-((365*TIMER_ANO)+(TIMER_ANO/4)-(TIMER_ANO/100)+(TIMER_ANO/400));
}
 TIMER_MES2=((100*TIMER_DIA2)+52)/3060;
 TIMER_MES=((TIMER_MES2+2)%12)+1;
 TIMER_ANO=TIMER_ANO+((TIMER_MES2+2)/12);
 TIMER_DIA=TIMER_DIA2-((TIMER_MES2*306+5)/10)+1;
 //
 TIMER_ANO=TIMER_ANO%100;
 TIMER_ANO=TIMER_ANO+(TIMER_MES*100)+(TIMER_DIA*10000);
 return TIMER_ANO;
}

Evidentemente esta parte del codigo:
Código: [Seleccionar]
TIMER_ANO =((10000*TIMER_DIAS)+14780)/3652425;
Requiere un long long (entero de 64 bits) y no esta disponible para el PICC18 de Hitech.

La pregunta:
Tienen alguna solucion para realizar un calculo para enteros en 64 bits o un algoritmo de dias a fecha en 32 bits?

Saludos espero sus comentarios!!
« Última modificación: 31 de Octubre de 2007, 10:51:41 por Darukur »
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Re: Enteros de 64 bits?
« Respuesta #1 en: 31 de Octubre de 2007, 10:32:58 »
Je, que dolobu. Me lo autorespondi.
Código: [Seleccionar]
TIMER_ANO =((10000*TIMER_DIAS)+14780)/3652425;es lo mismo que
Código: [Seleccionar]
TIMER_ANO =((2000*TIMER_DIAS)+2956)/730485;Ya que es divisible por 5 y no afecta la matematica entera.

Con lo que me da la capacidad de calculo hasta el dia (2^32-2956)/2000=2147482 que es el año que seria el dia 9 del mes 10 del año 5879.

Despues de ese año sera problema de otro...  :D
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/

Desconectado Darukur

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 464
    • Informacion, recursos y ejemplos para desarrollos con microcontroladores
Re: Enteros de 64 bits?
« Respuesta #2 en: 31 de Octubre de 2007, 11:54:42 »
Hice un bucle de testeo del algoritmo para el rango de 1/1/2000 y funciono correctamente hasta el 1/1/2100 (no inclusive ya que uso fechas de 2 digitos)
Código: [Seleccionar]
tongo1=730424;//Inicia en el dia de fecha 1/1/2000
 do {tongo1++;
tongo2=TIMER_DIA_A_FECHA(tongo1);
tongo2=TIMER_FECHA_A_DIA(tongo2);
}
 while (tongo1==tongo2);
El que no sabe lo que busca no entiende lo que encuentra.
Mi Pagina Web:  http://www.sistemasembebidos.com.ar
Mi foro:             http://www.sistemasembebidos.com.ar/foro/