APPLE fallande division

[Paul Curtis] över på Segger har en intressant serie blogginlägg om beräkning av division. Det brukade vara en varmare ämne, men numera många datorer eller datorspråk har stöd för multiplikation och division inbyggd. men vissa processorer saknar instruktioner och ett bibliotek för att göra det kan vara mindre än idealisk. att veta hur man rulla din egen kan tillåta dig att optimera för hastighet eller utrymme. De nuvarande avbetalning omslag med hjälp av Newtons algoritm för att göra division.

Steve Martin hade en berömd lite om hur man blir en miljonär och aldrig betala skatt. Han började med att säga, ”Första … få en miljon dollar. Därefter …”Den här metoden är lite som att eftersom du först måste veta hur man multiplicera innan du kan dela. Grundtanken är dubbelt: Newtons metod kan du förfina en uppskattning av ett ömsesidigt genom successiva multiplikationer och sedan multiplicera ett nummer ett ömsesidigt är samma sak som att dela. Med andra ord, om vi behöver dela 34 med 6, kan du skriva om 34/6 till 34 * 1/6 och svaret är densamma.

Newtons approximation för reciprocals kan du ta en gissning på svaret och sedan förädla den genom en serie multiplikationer. Varje multiplikation skapar bättre noggrannhet. Du kan använda detta för att utföra en klassisk hastighet / rymd trade-off. Till exempel är bara låta antar vi vill hitta inversen av en byte (förmodligen en fast punkt byte). En uppslagstabell 256 element skulle ge perfekt precision och skulle vara mycket snabb. Inget mer matematik är nödvändig. men hur 32 bitar? Nu bordet är alldeles för stor. men du kan se upp, säger de första 8 bitarna av 32-bitars nummer. Eller mer. Eller mindre. beror på vad som är viktigt för dig.

Så nu har du en dålig uppskattning av din ömsesidig. Sir Issac kan göra det bättre. För vissa nummer ett, du tar din uppskattning (x) och multiplicera dem tillsammans. Subtrahera det numret från två och du har en faktor att multiplicera din gamla uppskattning genom att få en ny uppskattning. Hoppa framåt, är det klart om din uppskattning var rätt, skulle multiplikation ge dig en som inte skulle ändra den gamla uppskattning alls. Om uppskattningen är avstängd får du en skalfaktor.

Som en formel det ser ut så här:

x = x * (2-a * x);
Så om du bestämmer dig det reciproka värdet av 22 kan vara 0,02, kommer det första passet ger dig:

0,02 * (2-22 * 0,02) = 0,0312

0,0312 * (2-22 * 0,0312) = 0,0410

0,0410 * (2-22 * 0,0410) = 0,0450
Det rätta svaret är ett upprepande decimal 0.0454545 och om du fortsätta, kommer du dit.

Naturligtvis då måste man multiplicera en mer tid att göra divisionen.

Vi gillade att tjänsten har en implementering fast punkt och sedan undersöker den resulterande assemblerkod för ARM, RISC-V och dsPIC30. Väl värt ett läsa.

Vi älskar math knep vi kan använda i assembler. Om du arbetar på AVR och flyttal, missa inte denna metod.

Leave a Reply

Your email address will not be published. Required fields are marked *