/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
fixed point udregning
Fra : Joe


Dato : 08-06-10 00:25


Hvordan skriver/udregner man følgende udtryk i C på den mest effektive måde?

R=B*X+Z-A*Y

Variablerne R,B,X,Z,A og Y er 32-bit signed.

Variablerne indeholder Q1.15 værdier (altså værdier mellem -32768 til
32767).

R skal returnere resultatet i Q1.15 format.

Tak på forhånd.














 
 
Arne Vajhøj (08-06-2010)
Kommentar
Fra : Arne Vajhøj


Dato : 08-06-10 03:36

On 07-06-2010 19:25, Joe wrote:
> Hvordan skriver/udregner man følgende udtryk i C på den mest effektive
> måde?
>
> R=B*X+Z-A*Y
>
> Variablerne R,B,X,Z,A og Y er 32-bit signed.
>
> Variablerne indeholder Q1.15 værdier (altså værdier mellem -32768 til
> 32767).
>
> R skal returnere resultatet i Q1.15 format.

Hvis det er rene heltal, så er det nok mest effektivt as is.

Hvis XYZR har et implied antal decimaler men AB er heltal så ditto.

Hvis XYZABR alle har et implied antal decimaler, så skal de
to multiplikations resultater divideres med skalerings faktoren.

Hvis det er noget helt tredie, så skal vi nok have en definition
på Q1.15 !

Arne

Joe (08-06-2010)
Kommentar
Fra : Joe


Dato : 08-06-10 09:51

>>
>> R=B*X+Z-A*Y
>>
>> Variablerne R,B,X,Z,A og Y er 32-bit signed.
>>
>> Variablerne indeholder Q1.15 værdier (altså værdier mellem -32768 til
>> 32767).
>>
>> R skal returnere resultatet i Q1.15 format.
>
> Hvis det er rene heltal, så er det nok mest effektivt as is.
>
> Hvis XYZR har et implied antal decimaler men AB er heltal så ditto.
>
> Hvis XYZABR alle har et implied antal decimaler, så skal de
> to multiplikations resultater divideres med skalerings faktoren.
>
> Hvis det er noget helt tredie, så skal vi nok have en definition
> på Q1.15 !
>

Q1.15 betyder bare en signed 16-bit værdi hvor tallet skal fortolkes som
-1*BIT(16) + sum af 2^[BIT(n)*(n-16)] fra n=1 til 15...altså et tal
mellem -32768 og 32767 som kan
fortolkes som en værdi mellem -1 og tæt på 1...

Jeg har implementeret udregningen sådan her:

R = (B*X);
tmp = (int16_t) (R>>15);
R = ((int32_t)tmp)+Z;
tmp = (int16_t)R;
R = (A*((int32_t)Y));
tmp2 = -(int16_t) (R>>15);
Rout=tmp+tmp2;

Men jeg vil tro at det kan gøres mere smart?





Jens Jensen (08-06-2010)
Kommentar
Fra : Jens Jensen


Dato : 08-06-10 17:48

Joe skrev den 08-06-2010 10:51:
> Men jeg vil tro at det kan gøres mere smart?

Hvis int er 32 bit kan denne linie nok bruges:

R = ((int32_t)((int16_t)B * (int16_t)X) - (int32_t)((int16_t)A *
(int16_t)Y)) / (1 << 15) + Z

Udtrykket udnytter, at der sker integral promotion af 16 bit værdierne
til int.

Søg
Reklame
Statistik
Spørgsmål : 177554
Tips : 31968
Nyheder : 719565
Indlæg : 6408857
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste