게임 수학 - 어림 숫자 (올림,내림,반올림)
올림과 내림, 반올림은 C#, C++ 언어에서 제공하는 math 라이브러리에서 제공한다.
floor - 올림
floor 함수 포맷은 다음과 같다.
double floor(double _X)
이 함수는 들어온 실수형 인자 값을 소숫점 첫번째를 올림한다.
함수 사용하기
#include <cmath>
int main() {
printf("floor %.2f\n", floor(99.3));
}
floor 100.00
floor 함수는 인자 타입에 맞게 묵시적 형 변환을 해주지만,
명시적으로 형변환을 사용하고 싶다면 아래 함수를 사용하도록 한다.
올림 함수 종류
- double floor(double _X)
- float floorf(float _X)
- long double floorl(long double _X)
ceil - 내림
ceil 함수 포맷
double ceil(double _X)
이 함수는 들어온 실수형 인자 값을 소숫점 첫번째부터 내림한다.
함수 사용하기
#include <cmath>
int main() {
printf("ceil %.2f\n", ceil (99.3));
}
ceil 99.00
ceil 함수도 묵시적 형 변환을 한다.
명시적으로 형변환을 사용하고 싶다면 아래 함수를 사용하도록 한다.
내림 함수 종류
- float ceilf(float _X)
- long double ceill(long double _X)
round - 반올림
소숫점 첫번째 숫자 따라서 올림하거나 내림하는 함수도 있다.
round 포맷
double round(double _X)
이 함수는 소숫점 첫 번째 자리에서 5 이상 큰 경우 올림하고 미만인 경우 내림한다.
함수 사용하기
#include <cmath>
int main() {
printf("round %.2f\n", round(99.3));
printf("round %.2f\n", round(99.5));
printf("round %.2f\n", round(99.8));
}
round 99.00
round 100.00
round 100.00
round 함수도 묵시적 형변환을 지원한다.
명시적 형변환은 아래에 참고해서 사용한다.
그리고 lround 함수도 있으며 이 함수의 특징은 long 타입으로 반환한다.
반올림 함수 종류
- long lround(double _X)
- long lroundf(float _X)
- long lroundl(long double _X)
- float roundf(float _X)
- long double roundl(long double_X)
자릿수를 변경하고 싶다면?
소수점 첫째가 아닌 소수점까지 표기하고 싶은 경우가 있을 것이다.
소수점 첫번째를 올림으로 표기하고 싶다면,
인자 값을 10 곱한 다음에 최종적으로 10 나눗셈하면 된다.
소수점 두번째가 필요한 경우 100 곱한 다음 100 나눗셈을 한다.
소숫점 반올림 표기하기
#include <cmath>
int main() {
printf("round %.2f\n", round(99.123 * 10) / 10);
printf("round %.2f\n", round(99.123 * 100) / 100);
}
round 99.10
round 99.12
단, 나눗셈 연산은 많은 비용이 들어 임베디드 또는 DSP 디지털 신호 처리에 부적절할 수 있다.x / 10
나눗셈 대신 x * 0.1
곱센 연산한다.
게임에서 어림 숫자를 다룰 때 참고
- 올림 한 경우 자릿수가 변경되는데 맥스치를 고려해야한다.
예) 999999.6 > 1000000.0 자릿수 변환이 되는데, 자릿수를 체크하는 로직이 있다면 검토가 필요할 수 있다. - 상대에게 피해를 입힐 때 실수형 "0.1" 처리 로직은?
예) 상대가 무력화, 치명타감소, 피해감소로 인해 0.3 피해를 입힐 시 0.0 값으로 내림한 경우 절대 쓰러트릴 수 없게 된다.
만약 피해를 입히는 계획이 있다면 올림으로 처리가 필요하다. - 데미지 계산에 반올림, 올림, 내림은 최종 연산에 반영 필요
- 만약 장비, 기본캐릭, 추가데미지, 일반데미지 합산이 많은 경우
20.7 * 2.8 + 30.7 에서 각각 올림한 연산한 94 피해가 발생한다. - 20.7 * 2.8 + 30.7 = 88.66 계산에서 올림 한 경우 89 피해가 발생한다.
- 만약 장비, 기본캐릭, 추가데미지, 일반데미지 합산이 많은 경우