float a = 123456789.0e-5f;
System.out.printf(%f %e\n", a, a);
위 코드에서
첫 번째 a 출력할 때 %f는 기본 소수점 아래 6자리까지 출력되니까
1234.567890이 찍혀야할거같은데 컴파일해보니
1234.567871이 나오는데 설명좀 부탁드릴게요!
추가로 변수 a를 double로 선언하면 1234.567890으로 찍히네요
안녕하세요 길벗수험서 운영팀입니다.
음.. 자세하게 설명하기에는 시험 수준을 너무 벗어나기에 간략하게만 설명드리겠습니다.
대부분의 컴퓨터 및 프로그래밍 언어들은 실수를 메모리에 저장할 때 '부동소수점 방식'이라는 것을 사용합니다.
이 부동소수점 방식에는 몇 가지 약점이 있는데, 특정 소수점 값을 계산할 때 "오차"가 발생한다는 것입니다.
이를 보완하기 위해 일반적인 응용 프로그램에서는 추가적인 연산 알고리즘이나 변형된 자료형을 통해 부동소수점 방식을 이용하죠.
말씀하신 1234.567871의 '71'이 바로 이 오차에 해당합니다.
시험에 이러한 부분은 나오지 않으니 이유만 간단히 알고 넘어가시는 것으로 충분합니다.
double의 경우 실수 표현에 쓰는 비트가 float의 두 배이다보니 오차 범위도 줄어들어 소수점 6자리 정도로는 오차가 잘 발생하지 않습니다.
행복한 하루되세요 :)
-
관리자2020-07-02 18:35:37
안녕하세요 길벗수험서 운영팀입니다.
음.. 자세하게 설명하기에는 시험 수준을 너무 벗어나기에 간략하게만 설명드리겠습니다.
대부분의 컴퓨터 및 프로그래밍 언어들은 실수를 메모리에 저장할 때 '부동소수점 방식'이라는 것을 사용합니다.
이 부동소수점 방식에는 몇 가지 약점이 있는데, 특정 소수점 값을 계산할 때 "오차"가 발생한다는 것입니다.
이를 보완하기 위해 일반적인 응용 프로그램에서는 추가적인 연산 알고리즘이나 변형된 자료형을 통해 부동소수점 방식을 이용하죠.
말씀하신 1234.567871의 '71'이 바로 이 오차에 해당합니다.
시험에 이러한 부분은 나오지 않으니 이유만 간단히 알고 넘어가시는 것으로 충분합니다.
double의 경우 실수 표현에 쓰는 비트가 float의 두 배이다보니 오차 범위도 줄어들어 소수점 6자리 정도로는 오차가 잘 발생하지 않습니다.
행복한 하루되세요 :)
-
관리자2020-07-03 11:00:03
안녕하세요 길벗수험서 운영팀입니다.
예, 71이 아닌 90으로 적으셔야 정답으로 인정될 것입니다.
정상적인 출제자라면 수험자에게 부동소수점으로 인한 오차까지 계산하게 만드는 문제를 출제하지는 않을테니까요. (심지어 이 오차는 메모리의 스펙이나 OS 등의 소프트웨어 스펙에 따라서도 달라질 수 있습니다.)
행복한 하루되세요 :)
-
*2020-07-02 22:28:45
그러면 만약에 시험에 저런 문제가 나온다는 가정하에 그냥 알고있는대로 적으면 정답인게맞는거죠?
해설지에도 답이 1234.567871로 나와있어서 헷갈려서요.. 추가로 문의드립니다!