V matematiki je deljenje z dva tisto, pri katerem število delimo z dva. Nekatere kulture, kot so stari Egipčani, so menile, da je to drugačna operacija kot deljenje. Tako so mislili tudi nekateri matematiki do 16. stoletja (1500-1599). Danes se deljenje z dvema posebej obravnava v sodobnem računalniškem programiranju.
Deljenje z dvema imenujemo tudi razpolovitev, posredovanje in dimidiranje.
Definicija
Razpolovitev pomeni izračunati vrednost števila, ko ga delimo z 2. Za poljubno realno število x velja:
- x / 2 je rezultat deljenja z 2 (enako kot množenje z 0,5: x * 0.5).
- Če je x celo število, je rezultat lahko celo število (če je x sod) ali neceloten decimalni številski izraz (če je x liho).
- Za celo število n se pogosto zanima tudi ostanek pri deljenju z 2, ki ga dobimo z n % 2 — ostanek je 0 za sode in 1 (ali −1 pri nekaterih definicijah) za lihe, odvisno od znaka in definicije deljenja.
Zgodovina
Razpolovitev je ena najstarejših aritmetičnih operacij. V mnogih zgodovinskih kulturah so jo obravnavali posebej zaradi praktične uporabnosti (razdeljevanje dobrin, merjenje površin, gradbeni izračuni). Stari Egipčani so imeli metode, ki so temeljile na dvojitvah in zlomkih enotskih delov (unit fractions), zato je bila razpolovitev in množice deljenj z 2 pogosto obravnavana drugače kot splošno deljenje. V renesansi in po njej so se postopoma uveljavile sodobne aritmetične zakonitosti in zapisovanje deljenja kot enakopravne operacije.
Matematične lastnosti
- Za realna ali kompleksna števila deljenje z 2 nima posebnih omejitev — gre za množenje z 1/2.
- Za cela števila so pomembne različne definicije celi del (npr. zaokroževanje navzdol, navzgor ali trunciranje proti nič): v programskih jezikih se razlikujejo implementacije in operatorji.
- Deljenje z 2 je linearna operacija: (a + b) / 2 = a / 2 + b / 2.
- Pri binarnem zapisu števil odgovarja deljenje z 2 premiku bitov v desno za eno mesto (pri celoštevilskih predstavitvah), kar omogoča učinkovite algoritme.
Uporaba v programiranju
Razpolovitev je zelo pogosto dejanje v programiranju; uporablja se v aritmetiki, algoritmih in optimizacijah. Pomembne točke:
- Bitovni premik: Pri celoštevilskih vrednostih (posebej pri nenegativnih) se deljenje z 2 pogosto izvede z desnim bitnim premikom (n >> 1). Ta operacija je hitra, saj so bitni premiki osnovna strojna operacija.
- Negativna števila in pomnilniške reprezentacije: Pri znakovanih celih številih je uporaba bitnega premika lahko odvisna od jezika in strojne implementacije — desni premik lahko ohranja znak (aritmetični premik) ali vstavi ničle (logični premik). Zato pri negativnih številih pazite na obnašanje in raje uporabite običajno deljenje, če želite določeno pravilo za zaokroževanje.
- Zaokroževanje: Različni jeziki imajo različna pravila. Na primer:
- V C in Javi je celiško deljenje z znakovnimi celoštevilskimi tipy odrezalo (truncate) proti nič (C od C99 naprej, Java od začetka).
- V Pythonu operator // izvede deljenje navzdol (floor): -3 // 2 = -2, medtem ko -3 / 2 = -1.5 in (-3) >> 1 = -2 (aritmetični premik pri Pythonovih nespremenljivih int-ih).
- Optimizacija: V starejših ali nizkonivojskih programih se pogosto uporablja množenje z 0.5 ali bitni premik namesto deljenja, ker je bila delitev počasnejša. Sodoben prevajalniki pa so pogosto dovolj pametni, da te optimizacije opravijo samodejno.
- Algoritmi: Deljenje z 2 se pogosto pojavi v binarnem iskanju (izračun sredine intervala), v podatkovnih strukturah (npr. iskanje staršev ali otrok v binarnem drevesu glede na indeks) in pri izračunu medsebojne razdalje ali srednje vrednosti dveh točk.
- Preprečevanje overflowa pri izračunu sredine: Pri izračunu srednje vrednosti dveh indeksov low in high se pogosto izognejo overflowu z zapisom:
namesto mid = (low + high) / 2, kar prepreči začasno seštevanje velikih števil.mid = low + (high - low) / 2;
Primeri kode
Primeri, kako lahko razpolovitev izvedemo v pogostih programskih jezikih:
// C (celo število) int n = 7; int half = n / 2; // rezultat 3 (trunciranje proti 0) int half_shift = n >> 1; // če je n nenegativno, tudi 3 // Java int n2 = -7; int halfJava = n2 / 2; // -3 (trunciranje proti 0) int halfShift = n2 >> 1; // -4 (aritmetični premik ohrani znak) // Python n3 = 7 half_py = n3 / 2 # 3.5 (float) half_floor = n3 // 2 # 3 (floor za cela števila) half_shift_py = n3 >> 1 # 3 (aritmetični premik za cele števila) Priporočila in pasti
- Za jasno in prenosljivo vedenje pri deljenju z 2 uporabite eksplicitne operatorje, ki dajejo želeni tip rezultata: / za realne rezultate, // (kjer je na voljo) ali celiško deljenje za celoštevilske rezultate.
- Pri optimizacijah s premiki biti previdni z negativnimi številkami in značilnostmi jezika glede bitnih premikov.
- Če potrebujete natančen matematični rezultat v plavajoči natančnosti, raje uporabite množenje z 0.5 ali standardno deljenje — sodobni prevajalniki pogosto optimizirajo avtomatsko.
Razpolovitev je tako preprosta aritmetična operacija, a z zanimivimi zgodovinskimi, matematičnimi in računalniškimi vidiki, ki jih je vredno poznati, zlasti ko delamo z različno reprezentacijo števil in pri optimizaciji algoritmov.