p_ce1052   4년 전

게시판에 설명된 글을 읽었는데도 이해가 가지 않아서 질문드립니다. 컴퓨터가 1.000000001이나 0.999999999를 1과 다르게 본다는 것도 알겠고, 실수 표현의 유효숫자 자릿수의 개수가 정해져 있는 것도 알겠습니다. 근데 이 문제에서 그 부분이 왜 문제가 되나요? 10만개의 데이터에 대해 입력 범위가 0~10까지의 소수가 소수점 첫째 자리까지만 들어오는데 다 더해도 double의 유효숫자 15자리를 넘어설 것 같지 않고, 아주 작은 부분에서 오차가 있어도 소수점 셋째 자리에서 반올림하는데 영향을 줄 정도로 큰 오차는 아니지 않나요? 어떻게 저 작은 오차로 반올림 결과값이 달라지는지 이해가 가지 않습니다.

djm03178   4년 전

문제가 되는 것은 0.5와 같은 경우입니다. 만일 이 값이 실제로는 0.499999999999999와 같이 저장되어 있다면 소수 첫째 자리에서 반올림을 했을 때 1이 아닌 0이 됩니다.

p_ce1052   4년 전

감사합니다. 마지막으로 질문 하나만 더 드려도 될까요? 총합을 나눈 평균값이 10.1049999999999와 같이 나왔다고 한다면 답을 10.10으로 보는게 맞지 않나요? 부동소수점 방식의 오차 때문에 나눗셈 결과가 10.105로 나왔어야 할 것이 10.1049999999999로 저장되게 된다는 말씀이신가요?

scvhero   4년 전

이런 문제도 있습니다

https://ideone.com/Afb3Bu

djm03178   4년 전

실제 값이 10.105여야 하는데 10.1049999999999로 저장되었을 때 문제가 된다는 것입니다.

p_ce1052   4년 전

그냥출력하면 잘 나오는데 반올림했더니 값이 사라지는건 처음 보네요 ㄷㄷ 그래서 안전하게 1e-6을 더해놓는다 이런거군요

scvhero   4년 전

그냥 round등의 함수나 %.2lf 등을 이용하여 반올림을 했을 시 일반적인 반올림이 아닌  Round-to-nearest-even으로 반올림을 해서 그렇습니다

댓글을 작성하려면 로그인해야 합니다.