=================================
=================================
=================================
출처: http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=220
프로그래밍하다 보면 정말 많이 쓰이는게 비율 계산입니다.
가령 내 키가 저 산 높이라면 내 심장은 저기 어디 위치 쯤일 것이다라고 수학적으로 계산하는 것이죠.
비율 계산은 특히 화면에 그래프를 그려야 하는 경우면 거의 다 쓰이게 되는데,
옛날에는 중학생 과정(요즘은 잘 몰라서)에 나오기 때문에 누구나 다 쉽게 할수 있었습니다.
워낙 쉬우거닌까 따로 설명할 필요도 없이 닥치면 누구나 해결하는 것이지만
가끔 바쁘다 보면 헷갈릴때도 있습니다. (나이가 들어서 그런가?)
그래서 간단하게 그림으로 만들어 봤습니다.
그림에서 길이 A 인 막대의 p 위치를
길이가 B 인 막대의 x 위치를 찾는게 비율계산의 핵심인데,
비율 계산 공식에 의해
A:B = p:x 가 성립해야 하므로,
Ax = Bp 가 되고
x = Bp / A 가 되죠.
가령 A=5 B=10 이라고 하고 p=3 이라면
x = (3 * 10) / 5 = 6 으로 구해 집니다.
실제 실무에서는 이렇게 간단하고도 명료하게 비율 계산을 해야하는 경우 보다는,
매우 복잡한 상황에서의 계산이 요구되는 경우가 더 많은데
계산 공식이 아무리 복잡해 보여도 비율 계산의 핵심만 짚으면 어렵지 않게 해결할 수 있습니다.
하나 더 덤으로 프로그래머가 유의해야할 사항은
매우 정확한 계산을 위해서는 double 형으로 모두 계산하고
사용처가 int 형 같으면 계산된 결과값을 int 로 옮기는게 정밀도에 있어 유리합니다.
double x = 계산 공식;
int use = x;
이렇게 처리하는게 가장 좋은데
int x = 계산 공식;
이런 식으로 하면 정수 형에 대입하는 것을 고려해 컴파일러의 계산 정밀도가 낮아 지기 때문에
원치 않는 오차를 발생시킬 수 있기 때문입니다.
이걸 강의라고 하기는 그렇지만, 워낙 많이 쓰이는 것이고
혹시 이런 쉬운 거 때문에 시간 낭비하는 일이 생길까봐 여기에 올려둡니다.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
덧붙여서 실수를 정수대입하거나 int로 타입캐스트 할 경우 소수점 이하가 그냥 절삭되거든요. 정확한 계산을 위해서 부동소수점으로 계산한후 정수에 값을 대입할때는 0.5를 더해서 정수화해주는 방식이 필요할듯 싶습니다.
예) int i = int(3.14 + 0.5f);
반올림 함수가 뭐 있었는데 생각이 안난다는..ㅠㅠ
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
일반화 하면 영점이동->스케일변환->원점이동 이지요.
문제에서는 영점이동이 필요없는 예를 들고 계시니, 스케일변환만 하면 되구요.
ceil 과 floor 를 용도에 맞게 쓰시는것도 나쁘진 않습니다만, 함수호출이라 썩 내키진 않지요.
대신, 단순히 + 0.5f 를 쓰시면, 음수의 반올림 문제가 발생됩니다.
=================================
=================================
=================================
'프로그래밍 관련 > 프로그래밍 관련팁' 카테고리의 다른 글
XML 에서 문자열에 \n 인식하기 (0) | 2019.05.07 |
---|---|
프로그래밍 HEX 에서 colorRGB DEC(10진수)추출 또는 colorRGB 값에서 HEX(16진수)로 합치기 관련 (0) | 2018.04.18 |
AND 연산과 쉬프트 연산을 이용한 추출법, 분할, 조합(마우스, lParam, wParam) 관련 (0) | 2017.05.18 |
Visual Studio "비쥬얼시튜디오" 에서 리소스(.RC)파일을 열때 “리소스 컴파일러 DLL을 찾을 수 없습니다” 에러가 발생할 때 관련 (0) | 2017.05.12 |
java. 비트연산, 비트(bit)연산을 이용한 옵션(option)처리 샘플 코드 (0) | 2016.12.15 |