snabb divition av heltal?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

snabb divition av heltal?

Inlägg av dangraf »

Jag undrar om det finns något snabbt sätt att köra divition på en slö pic processor.

Om man skall köra en multiplikation t.ex ta talet Y = X*6 så kan man göra enligt följande:

Y = X<<2 + X<<1; \\ X*4+X*2

Men kan man göra det på något smidigt sätt åt andra hållet?

Jag skulle t.ex räkna ut X/20.
och Det går ju inte att göra enligt följande:

Y = X<<4 + X<<2; // X/16+ X/4

Om någon vet hur man gör snabba modulu beräkningar, så berätta gärna det oxå.

Någon som har en smart teknik?
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Det beror ju på om det är fasta divisioner som gäller, ska det vara x/y blir det inet snabbt men är det jämt x/10 kan det bli en annan sak. Detta kommer då att bli gjort från fall till fall.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

jag tänkte mig fasta divitioner, annars blir det ju svårt att optimera koden bättre än vad kompilatorn gör, misstänker jag.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

8, 16, 32 bit int ? float ?

Det är än jäkla skillnad...
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

En kompilator borde väl ta hänsyn till om det är division med en konstant. Ett enkelt trick som alltid fungerar är att göra om divisionen till en multiplikation.

X/20=X*1/20, 1/20=0.05 och binärt är det ungefär 0.000011001100110011001100....

Sedan måste du ju bestämma dig för vilken noggrannhet du ska ha, talrepresentation mm.

ex X/20)
Y1=X+X<<1+X<<4+X<<5;
Y=Y1>>10

Det kan vara nyttigt att fundera på noggrannheten i exemplet ovan.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Tackar! får fundera vidare på detta.. Om man kör babbages exempel så får man en multiplikation med 0.04980468... istället för 0.05. Det är ju tråkigt om felet växer med talet. Ska kolla upp om man kan använda sig av samma typ av algorithm som man kör med när man ritar linjer mellan 2 punkter (kommer inte ihåg vad den heter). Då kanske man kan få små avrundingsfel, istället för större och större fel. Men jag har inte kollat upp det än, så jag vet inte om jag resonerar rätt.

Tackar för hjälpen!
Användarvisningsbild
DeVille
Inlägg: 2361
Blev medlem: 29 mars 2004, 15:04:22
Ort: Dalsländska skogen.
Kontakt:

Inlägg av DeVille »

Metoden du tänker på är kanske newton-raphsons metod?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag har *mycket* svårt att tro att du kan hitta bättre kod och algoritmer
än de på piclist.com. Har du kollat ? Sen, god netiquet är bl.a att svara
på (mot-) frågor man får med avsikt att förtydliga problemställningen...
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Jag har tittat genom sidorna på piclist. Där fanns bla metoden från Robert A.LaBudde, som är väädligt lik den som babbage visade. Resten verkar vara ganska generella metoder för att köra divition som inte är konstanter.
Men, det hela verkar vara lite bökigare än jag tänkt från början, så det tar nog ett tag innnan jag läst genom allt och fått mig en bra uppfattning om det hela. Det verkar finnas en hel del nyttigheter där, tackar!

Det är väl ingen större skillnad på tekniken/metoden man avänder för att köra divition mellan 8,16 el 32 bitars tal? däremot blir implementationen lite olika. Flyttal har jag aldrig nämnt, de är inte så lätt att bara skifta dem och få ur rätt värden vad jag förstått.

Vad menar du med bättre "algorithmer"? Den blir väl inte bättre än hur den används? Är du säker på att exakt alla algorithmer för divition eller som kan användas till divition finns representerade på just den sidan?

Sen, god netiquet är bl.a att inte svära i sina inlägg och inte kräva svar på frågor som inte har med problemet att göra :wink: Må gott!
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> ...Resten verkar vara ganska generella metoder för att köra divition som
> inte är konstanter.

Förrutom att kodgeneratorn kan ge kod för valfri konstant.

> Flyttal har jag aldrig nämnt,..

Ingen annan datatyp heller, det var därför jag frågade. :-)
Rutinerna blir ju lite olika, och hastigheten, vilket jag tolkade som viktigt.

> Vad menar du med bättre "algorithmer"?

Tja, det finns ju en del som ger "exakta" resultat, och andra
som vinner lite prestanda mot ett lite större fel i svaret. Det hela
beror ju på vad man vill uppnå. T.ex kan en 8-bitars div med en fast
konstant *snabbast* lösas med en lookup tabell. Eller en kombination av
lookup och interpollation. Eller "rena" divisions algoritmer. Som sagt, det
hela beror på vad man vill uppnå.

> Är du säker på att exakt alla algorithmer för divition eller som kan användas till divition finns representerade på just den sidan?

Nej, det tror jag nog inte. Men jag tror att de viktigaste metoder som är aktuella
för en *PIC* finns där.

> ...inte kräva svar på frågor som inte har med problemet att göra...

Frågan om 8/16/32 biter eller int/float är ganska avgörande för problemet,
om det var den frågan du syftade på...

Allmänt gäller väl att det är nästan omöjligt att svara på utan att veta
vilka krav du har, hur applikationen ser ut och vilka värden det
handlar om.
Skriv svar