APPLE faldende division

April 24, 2022 0 Comments

[Paul Curtis] over på Segger har en interessant serie af blogindlæg om beregning division. Det plejede at være et varmere emne, men i dag mange computere eller computer sprog har støtte til multiplikation og division indbygget. men nogle processorer mangler de instruktioner og et bibliotek til at gøre det kan være mindre end ideel. vide, hvordan du rulle din egen kan give dig mulighed for at optimere for hastighed eller rum. De nuværende rate dækker hjælp Newtons algoritme til at gøre division.

Steve Martin havde en berømt lidt om hvordan man kan være en millionær og aldrig betale skat. Han startede ud med at sige, ”For det første … få en million dollar. Så …”Denne metode er lidt ligesom at siden du først nødt til at vide, hvordan man formere, før du kan dele sig. Den grundlæggende forudsætning er dobbelt: Newtons metode lader dig forfine et estimat af en reciprok ved successive multiplikationer og derefter gange et tal en gensidig er det samme som at dividere. Med andre ord, hvis vi har brug for at dividere 34 med 6, kunne du omskrive 34/6 til 34 * 1/6 og svaret er det samme.

Newtons tilnærmelse til reciprokke kan du tage et gæt på svaret og derefter forfine det gennem en række multiplikationer. Hver multiplikation skaber bedre nøjagtighed. Du kan bruge dette til at udføre en klassisk hastighed / rum afvejning. For eksempel er lad bare antage vi ønsker at finde den reciprokke værdi af en byte (formodentlig et fast punkt byte). En opslagstabel af 256 elementer ville give perfekt nøjagtighed og ville være meget hurtig. Ikke mere matematik er nødvendig. men hvad med 32 bit? nu bordet er bare for stor. men man kunne se op, siger, de første 8 bit af 32-bit tal. Eller mere. Eller mindre. afhænger af, hvad der er vigtigt for dig.

Så nu har du en dårlig vurdering af din gensidige. Sir Issac kan gøre det bedre. For nogle tal a, Du tager din estimat (x) og formere dem sammen. Trække at tal fra 2 og du har en faktor til at formere din gamle estimat med at få et nyt estimat. Skipping fremad, er det klart, om din estimat var rigtigt, ville den multiplikation give dig en som ikke ville ændre den gamle estimat på alle. Hvis estimatet er slukket, får du en skaleringsfaktor.

Som en formel ser det således ud:

x = x * (2-a * x);
Så hvis du beslutter den reciprokke værdi af 22 kunne være 0,02, vil den første passage give dig:

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

.0312 * (2-22 * .0312) = .0410

.0410 * (2-22 * .0410) = 0,0450
Det rigtige svar er en gentagende decimal 0.0454545 og hvis du holde ud, får du der.

Selvfølgelig, så har du til at formere en mere tid til at gøre divisionen.

Vi kunne godt lide, at stillingen har et fast punkt implementering og derefter undersøger den resulterende samling kode for ARM, RISC-V, og dsPIC30. Værd en læse.

Vi elsker matematiske tricks vi kan bruge i assembler. Hvis du arbejder på AVR og floating point, gå ikke glip af denne metode.

Leave a Reply

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