아래 함수는 분명 논리적으로는 전혀 문제가 없는 코드입니다. 하지만 이 코드에는 아주 치명적인 버그가 숨어 있습니다.
이 문제에 대해 인지를 하고 있음에도 불구하고, 아무생각없이 코딩을 하다보면 오류를 무시하고 코딩을 하게 됩니다.
파라메타 설정값에 따라 아주 정상적으로 수행을 하기 때문에 오류를 무시하기 아주 딱입니다.
오늘도 이 문제 때문에 광주까지 출장을 다녀왔네요.( 물론 이게 핵심을 아니었지만...)
void double_test(double start, double step, double stop)
{
double temp = start ;
while(true)
{
function(temp) ;
temp = temp + step ;
if(temp > stop) break ;
}
}
이 버그는 일반적으로는 아주 정상적으로 수행을 하지만, 특정한 값에서 비정상적으로 수행을 합니다. 바로 부동소수점 변수 때문입니다.
start=0, step=0.1, stop=5 일 경우 function 함수는 51번 수행되지만
start=0, step=0.1, stop=3 일 경우 function 함수는 30번 수행됩니다. 1번의 수행을 덜하게 됩니다.
이 함수의 치명적인 버그의 내용을 확인해 보려면 아래와 같이 코드를 수정한 후 테스트 해 보시면 됩니다.
void double_test(double start, double step, double stop)
{
double temp = start ;
int imsi ;
while(true)
{
imsi = temp * 100 ;
printf("%d\n", imsi) ;
temp = temp + step ;
if(temp > stop) break ;
}
}
|
결론만 말하면 부동소숫점을 쓸땐 조심하셔야 합니다.
http://rvelthuis.de/articles/articles-floats.html