De ce multiplicarea funcționează mai rapid decât împărțirea

Î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.

De fapt, procesorul poate funcționa numai cu biți
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:
inversiune
  • conjuncție
  • | | despărțire
  • >> schimbare dreapta
  • <<сдвиг влево

  • introducem operațiuni aritmetice în ordine:
    1. Adăugare, reduce în esență la adăugarea de biți într-o coloană
    2. Negarea sau schimbarea semnului, -a este exprimată ca
    a + 1
  • Scăderea a - b este exprimată în termeni de a + - b
  • Înmulțirea, aici mai multe opțiuni, depinde de compilator și optimizatorul său:
    1. Înmulțirea cu gradul 2 poate fi reprezentată de o deplasare spre stânga: a * 8 este redusă la a <<3 т.к. 8 - это 3я степень 2
    2. Cazurile simple cum ar fi * 3 pot fi înlocuite cu un + a + a
    3. 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.

    De ce multiplicarea funcționează mai rapid decât împărțirea

    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.







    Articole similare

    Trimiteți-le prietenilor: