Apple falling jako

[Paul Curtis] haltuun SEGGER on mielenkiintoinen sarja blogitekstejä laskennasta jako. Tähän asti on kuumempi aihe, mutta nykyisin monet tietokoneissa tai kielellä on tukea ja jakolasku sisäänrakennettuna. mutta jotkut prosessorit puuttuu ohjeet ja kirjasto tehdä se voi olla vähemmän kuin ihanteellinen. osata heittää oman saattaa voit optimoida nopeutta tai tilaa. Nykyisen erän kannet Newtonin algoritmilla tehdä jako.

Steve Martin oli kuuluisa vähän siitä, miten olla miljonääri ja koskaan maksa veroja. Hän aloitti sanomalla, ”Ensin … saada miljoonan dollarin. Sitten …”Tämä menetelmä on vähän kuin, että koska ensin täytyy tietää Miten kertoa, ennen kuin voit jakaa. Peruslähtökohtana on kaksijakoinen: Newtonin menetelmä voit tarkentaa arvion vastavuoroisesti peräkkäisillä kertolaskua ja sitten kertomalla useat vastavuoroisesti on sama kuin jakamalla. Toisin sanoen, jos meidän jakaa 34 6, voit kirjoittaa 34/6 34 * 1/6 ja vastaus on sama.

Newtonin approksimaatio reciprocals voit yrittää arvata vastaus ja sitten tarkentaa sitä läpi useita kertolaskuja. Kukin kertominen luo parempaa tarkkuutta. Voit käyttää tätä suorittamaan klassinen nopeus / tilaa kompromisseja. Esimerkiksi Haluan vain olettaa haluamme löytää vastavuoroista tavun (oletettavasti kiintopisteen tavu). Look-up taulukko 256 elementit aikaansaavat täydellisen tarkkuuden ja olisi erittäin nopea. Ei enää matematiikka on välttämätöntä. mutta entä 32 bittiä? Nyt pöytä on aivan liian suuri. mutta voit etsiä, sanovat, ensimmäinen 8 bittiä 32-bittinen numero. Tai enemmän. Tai vähemmän. riippuu siitä, mitä on sinulle tärkeää.

Joten nyt sinulla on huono arvio vastavuoroisesti. Sir Isaac voi tehdä paremmin. Joillekin luku a, Otat arvio (x) ja kerrotaan ne yhteen. Vähennä että numeron 2 ja sinulla on tekijä moninkertaistaa vanhat arvio saada uusi arvio. Ohita eteenpäin, on selvää, jos arvio oli oikeassa, kertominen antaisi sinulle 1, joka ei muuttaisi vanhoja arvion ollenkaan. Jos arvio on pois päältä, saat skaalaustekijänä.

Kaavana se näyttää tältä:

x = x * (2-a * x);
Joten jos päätät vastavuoroista 22 voisi olla 0,02, ensikierron antaa sinulle:

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

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

0,0410 * (2-22 * 0,0410) = 0,0450
Oikea vastaus on toistuva desimaalin 0.0454545 ja jos pitää käynnissä, saat siellä.

Tietenkin, sinun on moninkertaistaa vielä kerran tehdä jako.

Pidimme että tuessa on kiintolukutoteutukselle ja tutkii sitten saatua kokoonpanoa koodin ARM RISC-V ja dsPIC30. Kannattaa lukea.

Rakastamme matematiikka temppuja voimme käyttää konekielellä. Jos olet työskennellyt AVR ja liukulukujen, älä missaa tätä menetelmää.

Leave a Reply

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