APPLE padajúce divízie

[Paul Curtis] viac ako u Segger má zaujímavú sériu príspevkoch o výpočet rozdelenia. To býval tému teplejšie, ale v dnešnej dobe mnoho počítačov alebo počítačovej jazyky majú podporu pre násobenie a delenie vstavaný. ale niektoré procesory chýba pokyny a knižnicu na to, že to môže byť menej ako ideálne. vedel, ako vytvoriť vlastné Možno vám umožní optimalizovať pre rýchlosť alebo priestoru. Súčasné splátkové kryty pomocou Newtonova algoritmu robiť delenie.

Steve Martin mal slávny trochu o tom, ako sa stať milionárom a nikdy platiť dane. Začal tým, že hovorí: “Po prvé … získať milión dolárov. Potom … “Táto metóda je tak trochu ako, že od tej doby, musíte najprv vedieť, ako sa množia, ako budete môcť rozdeliť. Základným predpokladom je dvojaký: Newtonova metóda umožňuje spresniť odhad recipročnom základe následných násobenie a vynásobením množstva recipročné je rovnaká ako deliaca. Inými slovami, ak budeme musieť deliť 34 o 6, môžete prepísať 34/6 až 34 * 1/6 a odpoveď je rovnaká.

Newtonova priblíženia pre reciprocals umožňuje hádajte na odpoveď a potom upresniť ju cez sériu násobenie. Každý násobenie vytvára lepšiu presnosť. Môžete použiť na vykonanie classic rýchlosť / priestor kompromis. Napríklad, povedzme, len predpokladať, chceme nájsť prevrátená hodnota bajtu (pravdepodobne pevný bod bajtov). Pohľad-up tabuľka 256 prvkov by poskytlo dokonalú presnosť a bolo by veľmi rýchlo. Žiadne ďalšie matematika je nutná. ale čo 32 bitov? Teraz tabuľka je jednoducho príliš veľký. ale mohol vzhliadať, povedzme, prvých 8 bitov 32-bitové číslo. Alebo viac. Alebo menej. záleží na tom, čo je pre vás dôležité.

Takže teraz máte zlú odhad vášho prevrátené. Sir Isaac môže robiť to lepšie. Pre niektorých číslo a Beriete svoj odhad (X) a násobenie ich dohromady. Odpočítať toto číslo od 2 a máte faktor znásobiť svoj starý odhad tým získať nový odhad. Preskakovanie vpred, to je jasné, ak váš odhad bol v poriadku, násobenie by vám 1, ktorý nebude meniť pôvodný odhad vôbec. V prípade, že odhad je preč, dostanete meradlo.

Ako vzorec vyzerá takto:

x = x * (2-a * x);
Takže ak ste sa rozhodli prevrátená hodnota 22 môže byť 0,02, prvá nahrávka vám dá:

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

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

0,0410 * (2-22 * 0,0410) = 0,0450
Správna odpoveď je opakujúce sa desiatkovej 0.0454545 a ak budete pokračovať, budete sa tam dostať.

Samozrejme, potom budete musieť násobiť ešte raz k tomu divízii.

Sme radi, že miesto má implementáciu pevnú-bod a následne skúma výsledný montážny kód pre ARM, RISC-V a dsPIC30. No stojí za to čítať.

Milujeme matematické triky, môžeme použiť v assembleri. Ak pracujete na AVR a plávajúcou desatinnou čiarkou, nemajú túto metódu chýbať.