/ 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
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Optimering af sqrt og pow
Fra : Bo Jensen


Dato : 19-05-03 11:06

Jeg har en kode der adskillige millioner gange beregner sqrt(x) og
pow(x,2) hvor x er en double. Idet algoritmen alligevel er en
heuristik er jeg ikke specielt interreseret i en nøjagtig værdi af
disse funktioner, omkring en korrekt værdi på 2-3 decimal er
tilstrækkeligt. Jeg tænkte på at kode en relaksering med en given
nøjagtighed, men det må være lavet før, nogen forslag til hvor ?
Ydermere benyttes sqrt funktionen kun i fobindelse med følgende
udtryk:

double result=result/sqrt(x) eller nærmere result/=sqrt(x)

Kan dette ikke udnyttes også ?
Med venlig hilsen
Bo

 
 
Bertel Lund Hansen (19-05-2003)
Kommentar
Fra : Bertel Lund Hansen


Dato : 19-05-03 11:32

Bo Jensen skrev:

>Jeg har en kode der adskillige millioner gange beregner sqrt(x) og
>pow(x,2) hvor x er en double.

Pow(x,2) ville jeg da hastigt lave om til x*=x;

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Bo Jensen (19-05-2003)
Kommentar
Fra : Bo Jensen


Dato : 19-05-03 15:16

Bertel Lund Hansen <nospamfor@lundhansen.dk> wrote in message news:<ogchcvk5tl96tcnej7127fjpbnlm9u4ci8@news.stofanet.dk>...
> Bo Jensen skrev:
>
> >Jeg har en kode der adskillige millioner gange beregner sqrt(x) og
> >pow(x,2) hvor x er en double.
>
> Pow(x,2) ville jeg da hastigt lave om til x*=x;

Jeg er helt klar over at dette er hurtigere, men spørgsmålet gik nu
mere på om det ikke kan beregnes hurtigere ved at relaksere
nøjagtigheden.
Bo

Jakob Nielsen (19-05-2003)
Kommentar
Fra : Jakob Nielsen


Dato : 19-05-03 16:38

> > Pow(x,2) ville jeg da hastigt lave om til x*=x;
>
> Jeg er helt klar over at dette er hurtigere, men spørgsmålet gik nu
> mere på om det ikke kan beregnes hurtigere ved at relaksere
> nøjagtigheden.

For sqrt måske. Sikkert ikke da fpu'en har sqrt i hardware som din software
implementation næppe kan hamle op med. Jeg _ved_ det dog ikke, så ret mig
endelig hvis det er en gal slutning.
Jeg ved dog at man indenfor bla. realtime 3d simulationer i spil benytter en
aproximeret sqrt som er ret unøjagtig men hurtig. Den giver dig dog langt
fra 3 decimaler efter komma.

Hvad angår pow(x,2) så vil x*x til hver en tid være det hurtigste du kan.
Det er et simpelt gangestykke som løses i et hug.



Peder Skyt, Z=nospam (19-05-2003)
Kommentar
Fra : Peder Skyt, Z=nospam


Dato : 19-05-03 17:13

On 19 May 2003 03:06:19 -0700, bojensen_99@yahoo.dk (Bo Jensen) wrote:

(Bemærk: Jeg er *ikke* matematik-kyndig)

>pow(x,2)
== x*x

>result/=sqrt(x)

Prøv med sqrt((float)x). Undersøg & test din compilers muligheder for
optimering & profilering - har du f.eks. husket at vælge fast-math?

En opslagstabel for f(x) er kun anvendelig hvis x let & hurtigt kan
omdannes til et passende lille heltal.

Typisk vil nedbrydning & optimering af den overordnede algoritme give
*meget* bedre resultat end optimering af en lille detalje. Muligheder
for optimering af din mikroskopiske kodestump afhænger meget af hvad x
er. Måske kan du helt undgå sqrt() og divisioner?

F.eks. kan result/=sqrt() mig bekendt omsættes til result*=1/sqrt(x),
hvilket er interessant fordi 1/sqrt() typisk er en *del* af
sqrt()-algoritmer.


>det må være lavet før, nogen forslag til hvor ?

http://www.azillionmonkeys.com/qed/sqroot.html
Se hastigheder nederst - 10 clock cycles? Svært at gøre bedre.

Ellers er her måske noget:
http://www.programmersheaven.com/zone3/mh173.htm
(nederst: Mathematics, General Code)


/Peder Skyt

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

Månedens bedste
Årets bedste
Sidste års bedste