I recently learned that integer overflow is an undefined behavior in C (side question - is it also UB in C++?)
Often in C programming you need to find the average of two
A simple approach is the following
int c = a / 2 + ( b + a % 2 ) / 2;
For example a and b can be represented as
a = 2 * n + r1;
b = 2 * m + r2;
Then
( a + b ) / 2 => ( 2 * n + r1 + 2 * m + r2 ) / 2 => 2 * n / 2 + ( b + r1 ) / 2
And the last expression gives you
=> a / 2 + ( b + a % 2 ) / 2
The more correct expression is the following
int c = a / 2 + b / 2 + ( a % 2 + b % 2 ) / 2;
For example if we have
int a = INT_MAX;
int b = INT_MAX;
then c calculated as
int c = a / 2 + b / 2 + ( a % 2 + b % 2 ) / 2;
will give c == INT_MAX
EDIT: there was found interesting difference between the effect of computer operators and the effect of mathematical operators. For example according to the mathematics -1 can be represented as
-1 = -1 * 2 + 1
that is according to the formula
a = 2 * n + r1
2 * n
shall be an integer number less than or equal tp a
So the number that is less -1 is -2. :)
I think that the general formula shown by me would work it is required that for odd negative numbers there would be considered even negative numbers that less than the odd negative number.
it seems that the correct formula looks as
int c = ( a < 0 ? a & ~1 : a ) / 2 +
( b < 0 ? b & ~1 : b ) / 2 +
( ( a & 1 ) + ( b & 1 ) ) / 2;
It is important to note that from the mathematical point of view the average of -1
and -2
shall be equal to -2
and the formula gives the correct result.:)