티스토리 뷰

C++을 사용하다 보면 중간 값을 구하는 연산으로 흔히들 아래와 같이 쓴다

mid = (l + r ) / 2;
mid = (left + right) / 2;
// 또는
mid = (start + end) / 2;

가끔 다른 사람들이 짜 놓은 소스코드를 보면 아래와 같이 돼있는 걸 본적이 있다.

mid = l + (r - l) / 2;
mid = left + (right - left) / 2;
mid = start + (end - start) / 2;

수학적으로는 전혀 차이가 없는데 저렇게 나누는 이유는?
Overflow 때문이다.

변수들이 int로 선언된 경우,
left + right가 INT_MAX를 넘어서는 경우 overflow가 일어나서 원하는 결과대로 수행이 되질 않는다.
따라서 최소한의 방어벽을 치기 위해 l + (r - 1)/2 와 같은 형태로 구현한다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함