Divizia Apple Falling
[Paul Curtis] de la Segger are o serie interesantă de postări de blog despre calcularea diviziei. Acest lucru a fost un subiect mai fierbinte, dar astăzi multe computere sau limbi de calculator au suport pentru multiplicare și diviziune încorporată. Dar unii procesatori nu au instrucțiunile și o bibliotecă pentru a face acest lucru ar putea fi mai puțin decât ideal. Știind cum să vă răsuciți propria dvs. vă poate permite să optimizați viteza sau spațiul. Capacele curente de tranșă utilizând algoritmul lui Newton pentru a face diviziune.
Steve Martin a avut un faimos despre cum să fie un milionar și să nu plătească niciodată impozite. A început să spună: “În primul rând … obține un milion de dolari. Apoi … “Această metodă este un pic cam așa, deoarece mai întâi trebuie să știți cum să multiplicați înainte de a vă putea împărți. Premisa de bază este dublă: metoda lui Newton vă permite să perfecționați o estimare a unei multiplicări succesive și apoi înmulțirea unui număr un reciproc este același cu împărțirea. Cu alte cuvinte, dacă trebuie să împărțim 34 de 6, ați putea rescrie 34/6 la 34 * 1/6, iar răspunsul este același.
Aproximarea lui Newton pentru reciprocități vă permite să luați o presupunere la răspunsul și apoi să o perfecționați printr-o serie de multiplicări. Fiecare multiplicare creează o mai bună precizie. Puteți utiliza acest lucru pentru a efectua o schimbare clasică de viteză / spațiu. De exemplu, să presupunem doar că vrem să găsim reciprocitatea unui octet (probabil un octet de punct fix). O masă de căutare de 256 de elemente ar oferi o precizie perfectă și ar fi foarte rapid. Nu este nevoie de matematică. Dar ce zici de 32 de biți? Acum, masa este prea mare. Dar ai putea să te uiți, să zicem, primii 8 biți ai numărului de 32 de biți. Sau mai mult. Sau mai putin. depinde de ceea ce este important pentru dvs.
Deci, acum aveți o estimare slabă a reciprocității voastre. Sir Issac poate face mai bine. Pentru un număr A, luați estimarea (X) și le multiplicați împreună. Scaderea acestui număr de la 2 și aveți un factor pentru a vă înmulți vechiul estimare pentru a obține o nouă estimare. Sari peste, este clar dacă estimarea dvs. a avut dreptate, multiplicarea vă va oferi 1 care nu ar schimba deloc estimarea veche. Dacă estimarea este oprită, veți obține un factor de scalare.
Ca o formulă se pare că aceasta:
x = x * (2-A * x);
Deci, dacă decideți reciprocitatea din 22 ar putea fi .02, prima trecere vă va oferi:
0,02 * (2-22 * 0.02) = .0312
.0312 * (2-22 * .0312) = .0410
.0410 * (2-22 * .0410) = 0,0450
Răspunsul corect este o zecimală repetată 0,0454545 și dacă continuați, veți ajunge acolo.
Desigur, atunci trebuie să multiplicați încă o dată pentru a face divizia.
Ne-a plăcut că postul are o implementare cu punct fix și apoi examinează codul de asamblare rezultat pentru ARM, RISC-V și DSPIC30. Merită o citire.
Ne place trucurile matematice pe care le putem folosi in limba de asamblare. Dacă lucrați la AVR și Punctul Floating, nu ratați această metodă.