예전에 두수를 더할때 오버플로우가 나지 않을까 걱정했던게 생각나네요.
그때는 그런 생각만 했었고 그냥 두 수를 더하여 나누어 평균을 구했죠. ㅎㅎㅎ
흔히 알고 있는 두 숫자의 평균을 구하는 방법은 다음과 같습니다.
이것을 C/C++ 코드로 보면 다음과 같습니다.
다음 코드를 실행해 봅시다.
분명히 a 의 값도, b 의 값도, 그리고 계산 결과인 c 의 값도 int 의 범위에 들어간다.
하지만 a + b 는 3000000000 (30억)이 되어 int 의 범위를 넘어서게 된다.(int 의 표현 범위는 대략 ±21억이다)
여기서 발생되는 오버플로우가 이처럼 엉뚱한 결과를 가져다 주는 것이다. 이와 같은 오류를 방지하기 위해서는 다음과 같이 평균을 구해야 한다.
그때는 그런 생각만 했었고 그냥 두 수를 더하여 나누어 평균을 구했죠. ㅎㅎㅎ
흔히 알고 있는 두 숫자의 평균을 구하는 방법은 다음과 같습니다.
'두 숫자를 더해서 2로 나눈다'
이것을 C/C++ 코드로 보면 다음과 같습니다.
int a = 10;
int b = 20;
int c = (a + b) 2;
이 방법은 a 와 b 의 값이 매우 크거나 매우 작은 경우 (매우 작은 경우는 매우 큰 경우에 -1 을 곱하면 된다) 에는 적용할 수 없습니다.다음 코드를 실행해 봅시다.
int a = 1000000000;
int b = 2000000000;
int c = (a + b) / 2;
c 에 들어가는 값은 1500000000 이 아닌 -647483648 와 같은 엉뚱한 값이 된다.분명히 a 의 값도, b 의 값도, 그리고 계산 결과인 c 의 값도 int 의 범위에 들어간다.
하지만 a + b 는 3000000000 (30억)이 되어 int 의 범위를 넘어서게 된다.(int 의 표현 범위는 대략 ±21억이다)
여기서 발생되는 오버플로우가 이처럼 엉뚱한 결과를 가져다 주는 것이다. 이와 같은 오류를 방지하기 위해서는 다음과 같이 평균을 구해야 한다.
int a = 1000000000;
int b = 2000000000;
int c = (a > b ? (a - b) / 2 + b : (b - a) / 2 + a);
?: 연산자가 익숙하지 않은 분들을 위해 풀어쓰면 다음과 같다.int a = 1000000000;
int b = 2000000000;
int c;
if (a > b)
c = (a - b) / 2 + b;
else
c = (b - a) / 2 + a;
출처 : 온라인 게임 개발자 이창연
댓글
댓글 쓰기