반응형
임베디드 환경에서는 가급적 부동소수점 연산을 피하고, 정수 연산을 선호하는 경우가 많다.
실제로 다루는 데이터가 정수 단위인 경우가 많기 때문이기도 하지만 성능 최적화를 위해 실수 연산을 직접 사용하기보다 값을 미리 scale up한 뒤 정수 연산으로 처리하고, 필요한 시점에만 의미 있는 단위로 해석하는 방식이 널리 사용된다.
이때 유용하게 사용할 수 있는 것이 바로 정수 나눗셈 기반의 올림과 반올림 매크로 함수이다. 다음 코드는 리눅스 커널에서도 사용된다.
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define DIV_ROUND_CLOSEST(n, d) (((n) + ((d) / 2)) / (d))
- DIV_ROUND_UP : 정수 나눗셈 결과를 올림
- DIV_ROUND_CLOSEST : 정수 나눗셈 결과를 반올림
내림 매크로 함수가 별도로 없는 이유는 C언어의 정수 나눗셈 기본 동작이 버림이기 때문이다.
DIV_ROUND_UP, DIV_ROUND_CLOSEST 매크로 사용 시 주의사항
위 매크로 사용 시 주의할 점은 반드시 아래 조건이 만족되는 경우 사용해야 한다.
- n, d는 정수
- n >= 0
- d > 0
이 매크로들은 양의 정수 전용으로 설계되어 있기 때문에 위 조건을 만족하면 signed, unsinged를 혼합해 사용해도 무방하다. 다만, 덧셈이 일어나는 부분에서 n이 타입의 최댓값에 근접할 경우 오버플로우가 발생할 수 있음은 유의해야 한다.
DIV_ROUND_UP의 원리
(n + (d - 1)) / d
분자 n에 (d - 1)을 더하면
- 나머지 r = 0인 경우, (d - 1) 만큼 더해도 몫은 변하지 않고
- r > 0인 경우, (d - 1) + r이 d 이상이 되어서 몫이 1 증가한다.
DIV_ROUND_CLOSEST의 원리
(n + d/2) / d
나누기 전에 0.5에 해당하는 값인 d/2를 미리 더해주면, 이후의 정수 나눗셈의 기본 동작인 버림이 반올림 효과를 만든다.
반응형
'프로그래밍 > C' 카테고리의 다른 글
| C/C++ ] 리턴하지 않는 함수임을 명시하는 키워드 (0) | 2025.11.27 |
|---|---|
| C POSIX ] signal 사용법 (0) | 2025.06.12 |
| strtoul, strtol, strtof 구현 (0) | 2025.02.22 |
| C ] X-Macro (0) | 2025.01.30 |
| C] 콘솔 프로그램 플리커 현상 개선하기 (더블 버퍼링 & 오프스크린 버퍼) (0) | 2025.01.05 |