In mathematics, division by two or halving has also been called mediation or dimidiation.[1] The treatment of this as a different operation from multiplication and division by other numbers goes back to the ancient Egyptians, whose multiplication algorithm used division by two as one of its fundamental steps.[2]
Some mathematicians as late as the sixteenth century continued to view halving as a separate operation,[3][4] and it often continues to be treated separately in modern computer programming.[5]
Performing this operation is simple in decimal arithmetic, in the binary numeral system used in computer programming, and in other even-numbered bases. To divide an odd number by 2 use the mathematical solution ((N-1)÷2)+0.5. For example, if N=7, then ((7-1)÷2)+0.5=3.5, so 7÷2=3.5.
Binary
In binary arithmetic, division by two can be performed by a bit shift operation that shifts the number one place to the right.
This is a form of strength reduction optimization. For example, 1101001 in binary (the decimal number 105), shifted one place to the right, is 110100 (the decimal number 52): the lowest order bit, a 1, is removed. Similarly, division by any power of two 2k may be performed by right-shifting k positions. Because bit shifts are often much faster operations than division, replacing a division by a shift in this way can be a helpful step in program optimization.[5] However, for the sake of software portability and readability, it is often best to write programs using the division operation and trust in the compiler to perform this replacement.[6] An example from Common Lisp:
The above statements, however, are not always true when dealing with dividing signed binary numbers. Shifting right by 1 bit will divide by two, always rounding down. However, in some languages, division of signed binary numbers round towards 0 (which, if the result is negative, means it rounds up). For example, Java is one such language: in Java, -3 / 2 evaluates to -1, whereas -3 >> 1 evaluates to -2. So in this case, the compiler cannot optimize division by two by replacing it by a bit shift, when the dividend could possibly be negative.
Binary floating point
In binary floating-point arithmetic, division by two can be performed by decreasing the exponent by one (as long as the result is not a subnormal number). Many programming languages provide functions that can be used to divide a floating point number by a power of two. For example, the Java programming language provides the method java.lang.Math.scalb for scaling by a power of two,[7] and the C programming language provides the function ldexp for the same purpose.[8]
Decimal
The following algorithm is for decimal. However, it can be used as a model to construct an algorithm for taking half of any number N in any even base.
Write out N, putting a zero to its left.
Go through the digits of N in overlapping pairs, writing down digits of the result from the following table.
If first digit is
Even
Even
Even
Even
Even
Odd
Odd
Odd
Odd
Odd
And second digit is
0 or 1
2 or 3
4 or 5
6 or 7
8 or 9
0 or 1
2 or 3
4 or 5
6 or 7
8 or 9
Write
0
1
2
3
4
5
6
7
8
9
Example: 1738/2=?
Write 01738. We will now work on finding the result.
Median, a value that splits a set of data values into two equal subsets
Bisection, the partition of a geometric object into two equal halves
Dimidiation, a heraldic method of joining two coats of arms by splitting their designs into halves
References
^Steele, Robert (1922), The Earliest arithmetics in English, Early English Text Society, vol. 118, Oxford University Press, p. 82.
^Chabert, Jean-Luc; Barbin, Évelyne (1999), A history of algorithms: from the pebble to the microchip, Springer-Verlag, p. 16, ISBN978-3-540-63369-3.
^Jackson, Lambert Lincoln (1906), The educational significance of sixteenth century arithmetic from the point of view of the present time, Contributions to education, vol. 8, Columbia University, p. 76.
^Hook, Brian (2005), Write portable code: an introduction to developing software for multiple platforms, No Starch Press, p. 133, ISBN978-1-59327-056-8.
^"Math.scalb". Java Platform Standard Ed. 6. Retrieved 2009-10-11.
^Programming languages — C, International Standard ISO/IEC 9899:1999, Section 7.12.6.6.