Como manipular um numero de 64bits?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como manipular um numero de 64bits?

Mensagempor Mersin » 01 Out 2011 14:18

Olá companheiros de forum,

Preciso da ajuda de vocês, principalmente dos "matematicos", é que na minha aplicação preciso fazer uma "regra de três" com dois números de 32bits (int32), então preciso de fazer divisão e multiplicação.

O mais perfeito seria se eu pudesse Multiplicar primeiro pra depois dividir o resultado, MAS, como a multiplicação estouraria meu cálculo (int32) então eu faço é dividir primeiro pra depois multiplicar. Porém, dividindo primeiro eu sempre twenho "perda" de precisão nos cálculos, pois não estou trabalhando com float, mas somente inteiros.

Para eu poder multiplicar primeiro, preciso de uma forma de armazenar o resultado da multiplicação em uma variável de 64bits, pra depois dividir essa variável numa 2ª operação e voltar a ter o resultado em 32bits.

Vocês saberiam me ajudar em como implementar isso?

Grato mais uma vez!
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor chrdcv » 01 Out 2011 15:32

typedef signed int i32_t;
typedef long signed int i64_t;

register i64_t res
register i32_t val1, val2;
res = (i64_t)(val1*val2);
res /= (i64_t)val3;

chrdcv
Avatar do usuário
chrdcv
Dword
 
Mensagens: 1580
Registrado em: 13 Out 2006 14:13

Re: Como manipular um numero de 64bits?

Mensagempor andre_luis » 01 Out 2011 16:57

Mersin,


Já passei por esse dilema também, e no meu caso, surgiram 2 alternativas possíveis para otimização :
1 ) Realizar essa "multiplicação-e-divisão" em 2 etapas. Como o divisor já era composto por vários fatores, eu poderia calcular o primeiro resultado e depois multiplicar pelo segundo. Assim, a magnitude dos resultados caberia no tipo de variável de meu interesse.
[ Dividendo 1 / Divisor1 ] * [ Dividendo 2 / Divisor2 ]


2 ) Uma outra opção, como o divisor era constante, transformei o valor numa potencia de 2, e aí foi possível transformar uma operação de divisão num mero deslocamento ( shft ).
[ Dividendo / 12 ] = [ (256/12) * Dividendo / 256 ] = [ 21 * Dividendo >> ( 1 Byte ) ]

Com isso, apesar de usar variável do tipo long resultou numa melhoria de performance, pois com a divisão o microcontrolador consumia mais de 600 microinstruções, e depois passou a consumir cerca de 200 microinstruções.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Mersin » 21 Out 2011 08:49

Obrigado amigos pela ajuda,

Vou testar as dicas, primeiramente pela dica do chrdvc, me parece também mais genérica.

Só que não estou conseguindo fazer isso no CCS e com a linguagem C. Recebo a mensagem "This type can not be qualified with this qualifier" fazendo referencia ao comando "typedef long signed int i64_t;".

chrdvc, como posso implementar isso no CCS e em C?
Mersin
Mersin
Byte
 
Mensagens: 121
Registrado em: 22 Out 2006 13:07
Localização: Goiânia

Mensagempor andre_luis » 21 Out 2011 19:44

O CCS não suporta inteiros de 64 bits.
Porque não usa uma variável do tipo float ?

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x