Beräknings kostnad för exp() funktionnen

Fysik, biologi, teknik, ETC.

Moderator: Moderatorgruppen

Användarvisningsbild
Euklides
Inlägg: 150
Blev medlem: 23 sep 2005 01:25

Beräknings kostnad för exp() funktionnen

Inläggav Euklides » 18 dec 2010 03:36

Har ett matematiska beräkningsproblem och står in för att använda antigen ett exp()-funktionskall eller två kvadreringar.

Någon som vet om beräkningskostnaderna skiljer sig mycket åt i dem två fallen?

tack på förhand

lösdrivaren
Avstängd
Inlägg: 869
Blev medlem: 16 okt 2010 12:33

Inläggav lösdrivaren » 18 dec 2010 04:04

Vi äro ej tankeläsare. Beräkningsproblem? All matematik är problem.
Vill du suga ut max använd optimeringsmatematik. Se min signatur.
maximal utdelning med minimal ansträngning

Rorschach
Inlägg: 655
Blev medlem: 25 jul 2008 01:54

Re: Beräknings kostnad för exp() funktionnen

Inläggav Rorschach » 18 dec 2010 12:09

Euklides skrev:Har ett matematiska beräkningsproblem och står in för att använda antigen ett exp()-funktionskall eller två kvadreringar.

Någon som vet om beräkningskostnaderna skiljer sig mycket åt i dem två fallen?

tack på förhand


Det är lite för lite information och beroende på hur exp() och kvadrering är implementerat i språket ifråga. Antagligen är skillnaden försumbar och det är viktigare att en senare läsare av koden ska förstå vad man sysslat med, exp alternativet faller sig då naturligare.

Användarvisningsbild
Euklides
Inlägg: 150
Blev medlem: 23 sep 2005 01:25

Inläggav Euklides » 18 dec 2010 15:21

Det är lite för lite information och beroende på hur exp() och kvadrering är implementerat i språket ifråga. Antagligen är skillnaden försumbar och det är viktigare att en senare läsare av koden ska förstå vad man sysslat med, exp alternativet faller sig då naturligare.


Jo jag var medvetet lite oklar eftersom det inte är bestämt vilken språk programmet ska skrivas i. Lutar väl åt Python just nu. Kan bli (matlab, R eller java också). Jag förstår din poäng med klarhet, men det e ganska oväsentligt i sammanhanget. Oavsett skulle det i programmet framstå att det är en approximation av exp() funktionen. Saken är att utvärderingarna kommer att ske extremt många gånger, så även fast skillnaden inte är så stor kan den komma att spela roll.

Har du ngt hum om hur man faktiskt upp skattar en exponential funktion på en dator? Används gränsvärdet, lim(h->0)(1+h)^(t/h), där ngra iterationer körs? eller kanske en taylorutveckling? I båda fallen krävs betydligt fler beräkningar än två kvadreringar...

Dura M
Inlägg: 438
Blev medlem: 06 mar 2008 11:17

Inläggav Dura M » 18 dec 2010 16:19

Euklides skrev:Jo jag var medvetet lite oklar eftersom det inte är bestämt vilken språk programmet ska skrivas i. Lutar väl åt Python just nu. Kan bli (matlab, R eller java också). Jag förstår din poäng med klarhet, men det e ganska oväsentligt i sammanhanget. Oavsett skulle det i programmet framstå att det är en approximation av exp() funktionen. Saken är att utvärderingarna kommer att ske extremt många gånger, så även fast skillnaden inte är så stor kan den komma att spela roll.

Om exekveringshastigheten är viktig är nog valet av språk betydligt viktigare än valet mellan e^x och kvadrering. Sedan är det väl bara att du testar och ser hur stor skillnaden blir? Om kvadreringslösningen bara är en approximation bör du hålla dig till e^x tills du vet med säkerhet att den är för långsam för dina behov.

Euklides skrev:Har du ngt hum om hur man faktiskt upp skattar en exponential funktion på en dator? Används gränsvärdet, lim(h->0)(1+h)^(t/h), där ngra iterationer körs? eller kanske en taylorutveckling? I båda fallen krävs betydligt fler beräkningar än två kvadreringar...

Exponentialfunktionen är hårdvaruimplementerad i de flesta moderna processorer. Exakt hur algoritmen ser ut vet jag inte men i grunden beräknar processorn e^x som 2^(x / ln(2)) eller rent av som (2^(x / ln(2)) - 1) + 1, då 2^x - 1 är en enklare operation att implementera. Programmerar du i assembler kan du direkt använda "2^x - 1"-funktionen som alltså är något snabbare än e^x. (Det är även möjligt att vissa kompilatorer känner igen konstruktionen "pow(2, x)" eller "pow(2, x) - 1" och genererar optimal kod för detta. Kan vara värt att prova om man verkligen behöver optimera sin kod och basen 2 fungerar för det man vill göra.)

Användarvisningsbild
Euklides
Inlägg: 150
Blev medlem: 23 sep 2005 01:25

Inläggav Euklides » 18 dec 2010 18:12

Om exekveringshastigheten är viktig är nog valet av språk betydligt viktigare än valet mellan e^x och kvadrering.


Jo det är förmodligen sant, men valet av program beror på andra faktorer också, bla praktiska såsom att jag måste kunna det. Sen skadar det ju inte att optimera inom det språk man till slut använder. Men jag är med på vad du menar...

Sedan är det väl bara att du testar och ser hur stor skillnaden blir?


Sant! ska göra det nu också, tänkte bara kolla om jag överhuvudtaget var på rätt riktning. (Hade jag inte frågat hade jag inte få de värdefulla kommentarerna från dig heller).  

Exponentialfunktionen är hårdvaruimplementerad i de flesta moderna processorer. Exakt hur algoritmen ser ut vet jag inte men i grunden beräknar processorn e^x som 2^(x / ln(2)) eller rent av som (2^(x / ln(2)) - 1) + 1, då 2^x - 1 är en enklare operation att implementera. Programmerar du i assembler kan du direkt använda "2^x - 1"-funktionen som alltså är något snabbare än e^x. (Det är även möjligt att vissa kompilatorer känner igen konstruktionen "pow(2, x)" eller "pow(2, x) - 1" och genererar optimal kod för detta. Kan vara värt att prova om man verkligen behöver optimera sin kod och basen 2 fungerar för det man vill göra.)


Extremt intressant och väsentligt! tack

Dura M
Inlägg: 438
Blev medlem: 06 mar 2008 11:17

Inläggav Dura M » 19 dec 2010 16:58

Euklides skrev:Jo det är förmodligen sant, men valet av program beror på andra faktorer också, bla praktiska såsom att jag måste kunna det. Sen skadar det ju inte att optimera inom det språk man till slut använder. Men jag är med på vad du menar...

Absolut, men av de språk du räknar upp skulle jag välja Java om snabbhet är viktigt. Python har jag ingen erfarenhet av men det är väl ett interpreterat språk, liksom R och Matlab?

För övrigt, vid närmare eftertanke är jag osäker på om 2^x - 1 är enklare att implementera än 2^x. Skälet att välja 2^x - 1 kan också ha med numerisk noggrannhet att göra. Jag glömde också att nämna att x86-instruktionen 2^x - 1 endast tar x i intervallet -1 till 1, så heltalsdelen av argumentet måste hanteras separat. På andra processorer kan det säkert fungera annorlunda. Som du ser blir det snabbt lite messy när man ger sig ner och rotar på assemblernivå, men det kan vara intressant att känna till lite om vad som sker "under huven".

Rorschach
Inlägg: 655
Blev medlem: 25 jul 2008 01:54

Inläggav Rorschach » 20 dec 2010 00:41

Euklides skrev:
Det är lite för lite information och beroende på hur exp() och kvadrering är implementerat i språket ifråga. Antagligen är skillnaden försumbar och det är viktigare att en senare läsare av koden ska förstå vad man sysslat med, exp alternativet faller sig då naturligare.


Jo jag var medvetet lite oklar eftersom det inte är bestämt vilken språk programmet ska skrivas i. Lutar väl åt Python just nu. Kan bli (matlab, R eller java också). Jag förstår din poäng med klarhet, men det e ganska oväsentligt i sammanhanget. Oavsett skulle det i programmet framstå att det är en approximation av exp() funktionen. Saken är att utvärderingarna kommer att ske extremt många gånger, så även fast skillnaden inte är så stor kan den komma att spela roll.

Har du ngt hum om hur man faktiskt upp skattar en exponential funktion på en dator? Används gränsvärdet, lim(h->0)(1+h)^(t/h), där ngra iterationer körs? eller kanske en taylorutveckling? I båda fallen krävs betydligt fler beräkningar än två kvadreringar...


Optimeringen som diskuteras verkar vara på en rätt låg nivå. För mycket optimering på låg nivå orsakar ofta mer skada än nytta. Oftast är det väsentliga vilken algoritm man använder och inte vilket språk.


Återgå till "Naturvetenskap"

Vilka är online

Användare som besöker denna kategori: 6 och 0 gäster