Página 1 de 1

Como manipular um numero de 64bits?

MensagemEnviado: 01 Out 2011 14:18
por Mersin
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!

MensagemEnviado: 01 Out 2011 15:32
por chrdcv
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

Re: Como manipular um numero de 64bits?

MensagemEnviado: 01 Out 2011 16:57
por andre_luis
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.


+++

MensagemEnviado: 21 Out 2011 08:49
por Mersin
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?

MensagemEnviado: 21 Out 2011 19:44
por andre_luis
O CCS não suporta inteiros de 64 bits.
Porque não usa uma variável do tipo float ?

+++