În primul rând, este vorba de numai PL compilat în care întreg și numerele reale reprezentate tipuri de date platforma hardware native. Aceasta este 8/16/32/64-numere întregi și 32/64/80-biți validă. Toate acestea sunt în nici un fel se referă la script-urile dinamice și limbile în care numărul de incapacitate de plată aritmetică lung sau intervalul de valori sunt specificate în caietul de sarcini limba (de obicei, aceasta înseamnă utilizarea aritmetică lungă) - în toate aceste cazuri, calculul va merge zeci / sute / mii de ori mai lent decât de metal goale, iar diferența dintre înmulțire și împărțire (și alte operațiuni) nu vor fi vizibile deloc.
În al doilea rând, chiar și un limbaj compilat cu tipuri de date native, uneori, există verificări suplimentare (pentru preaplin, de exemplu) și norme speciale de aplicare a operațiilor matematice care afectează performanța mult mai mult decât diferența dintre diviziunea și multiplicarea. Un bun exemplu - un eveniment uimitor la cython.
Cu numere întregi totul pare destul de simplu:
Prima cifră a numărului determină semnul numărului - 0 pentru pozitiv și 1 pentru negativ
Avem operațiuni pentru controlul biților:
introducem operațiuni aritmetice în ordine:
- Adăugare, reduce în esență la adăugarea de biți într-o coloană
- Negarea sau schimbarea semnului, -a este exprimată ca
- Înmulțirea cu gradul 2 poate fi reprezentată de o deplasare spre stânga: a * 8 este redusă la a <<3 т.к. 8 - это 3я степень 2
- Cazurile simple cum ar fi * 3 pot fi înlocuite cu un + a + a
- Cazurile pentru a 11 * mai dificil de a ori de 11 ori cu sine nu este optim
descompunem 11 în puteri de 2: 11 = 8 + 2 + 1
calculăm (a <<3) + (a <<1) + a
Cu toate numerele reale sunt mai complicate, ele sunt, de asemenea, reprezentate sub formă de biți, dar unele biți sunt alocate partea întreagă și o parte mantisa
De fapt, numărul este stocat într-o formă exponențială, unde mantisa reprezintă o putere de 2, la care întreaga parte
Operațiile asupra numerelor reale cu mantisa nonzero sunt mai costisitoare în ceea ce privește numărul de cicluri de procesoare
Aici avem nevoie de lucruri, cum ar fi expozant și logaritmul natural, care poate fi calculată ca suma seriei, doar după suma unei calculate multe alte funcții matematice
Având un exponent și un logaritm, se poate exprima o funcție de putere
Diviziunea poate fi, de asemenea, reprezentată prin înmulțire și grad
Aici, aici, matematica superioară pe numerele binare apare "în spatele scenei" programelor noastre aparent simple
sitev.ru - blogul meu.
Nu neapărat. Aici am realizat că multiplicarea funcționează mai încet decât diviziunea:
Iată cifrele pe care le am:
Testați mul
timp = 47
2.42092e-322
Test div
timp = 16
3.73872e-32
Multiplicarea încetinirii este de trei ori)
Și nu confunda că, odată cu adăugarea a încă opt zerouri la cifra de numărul de iterații ale buclei în timpul executării codului dvs. nu se schimba (mai degrabă decât atârnă de ani de zile)?
rextester.com/CGEIT60937
Nu, nu deranjează. Încercam doar să resping întrebarea "De ce multiplicarea funcționează mai repede decât împărțirea?". Se pare cum sa întâmplat, să săpați mai adânc - nu este timp.
Programator și producător de hardware
Deoarece pentru divizare, rezultatul rezidual va fi necesar în etapa intermediară a diviziunii. Prin urmare, operațiunea va fi întotdeauna consecventă. Pentru adăugarea, scăderea și multiplicarea, puteți utiliza scheme de accelerare paralelizând calculul. Cu divizare, un astfel de număr nu va funcționa sau se va obține un circuit greoi cu un interval de întârziere foarte lung, ceea ce este mai ușor să îl faci secvențial. Prin urmare, în programare, este de preferat să evitați operațiile de divizare cât mai mult posibil.
P.S. Acest lucru poate fi învățat din cărțile despre circuite. Există o secțiune pentru parsarea materialului cu reprezentarea numerelor de procesare pe un computer.