프로그래밍 관련/프로그래밍 관련팁

[팁] 많이 쓰이는 비율 계산 관련

AlrepondTech 2017. 7. 31. 11:31
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

출처: 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 를 쓰시면, 음수의 반올림 문제가 발생됩니다. 

 

 

=================================

=================================

=================================

 

 

반응형