[문제 상황]
평균을 구한 후 소수점 첫째 자리에서 반올림해서 다음과 같이 출력 코드를 썼을 때
printf("%.f", avg);
평균이 0~-0.5 사이로 나오게 되면 출력이 아래와 같이 나오게 된다.
-0
0은 양수도, 음수도 아닌 숫자이지만, 보통 부호를 붙이지 않지, -0이라고 쓰지는 않는다. -0이 나오는 이유는 무엇이며 0에서 부호를 떼려면 어떻게 해야할까?
[원인]
소수를 저장하는 float 자료형은 다음과 같이 4바이트만큼의 크기를 가지고 있다.
이때 음수를 저장해야 할 때는 맨 앞 비트를 사용해서 음수임을 저장하는 것이다.
%.f를 이용해서 반올림을 할 때 소수점 첫째자리에서 반올림을 해서 출력을 한다면, 정수가 출력되는 것 처럼 보이지만, 실제로는 정수가 저장되어있는 것도 아니고 반올림 시 음수에서 양수로 변환해 주지도 않기 때문에, 음수를 나타내는 부호 비트가 그대로 남아있게 되어 마이너스 부호를 출력하는 결과가 나오는 것이다.
[해결 방법]
만약 소수점 첫째 자리에서 반올림해서 정수 형태로 표현하고 싶다면 진짜 정수 형태로 변환하는 방법을 사용하면 된다.
정수로 변환하는 방법은 여러 가지가 있지만, if문조차도 필요 없는, 최대한 단순한 코드를 사용해서 반올림 기능을 구현해 보았다.
printf("%d", avg < 0 ? (int) (avg - 0.5f) : (int) (avg + 0.5f));
if문 없이 반올림을 해보라는 과제가 있어서 머리를 쥐어짜다가 떠올린 뒤 요즘에도 자주 사용하고 있는 방식인데,
원리에 대해서 한번 정리해 봐야겠다.
'삽질후기' 카테고리의 다른 글
[VS] unexpected input value; log 10 failed 오류 (0) | 2022.03.02 |
---|