snabb divition av heltal?
snabb divition av heltal?
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?
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?
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.
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.
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!
Tackar för hjälpen!
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
Må gott!
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

> ...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.
> 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.