책 내용 질문하기
P.115 문제 8번 질문입니다
도서
2020 시나공 정보처리산업기사 실기 [기본서]
페이지
115
조회수
273
작성일
2020-07-02
작성자
탈퇴*원
첨부파일

float a = 123456789.0e-5f;

System.out.printf(%f    %e\n", a, a);

 

위 코드에서

첫 번째 a 출력할 때 %f는 기본 소수점 아래 6자리까지 출력되니까

1234.567890이 찍혀야할거같은데 컴파일해보니

1234.567871이 나오는데 설명좀 부탁드릴게요!

 

추가로 변수 a를 double로 선언하면 1234.567890으로 찍히네요 

답변
2020-07-02 18:35:37

안녕하세요 길벗수험서 운영팀입니다.

 

음.. 자세하게 설명하기에는 시험 수준을 너무 벗어나기에 간략하게만 설명드리겠습니다.

대부분의 컴퓨터 및 프로그래밍 언어들은 실수를 메모리에 저장할 때 '부동소수점 방식'이라는 것을 사용합니다.

이 부동소수점 방식에는 몇 가지 약점이 있는데, 특정 소수점 값을 계산할 때 "오차"가 발생한다는 것입니다.

이를 보완하기 위해 일반적인 응용 프로그램에서는 추가적인 연산 알고리즘이나 변형된 자료형을 통해 부동소수점 방식을 이용하죠.

말씀하신 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로 나와있어서 헷갈려서요.. 추가로 문의드립니다!

· 5MB 이하의 zip, 문서, 이미지 파일만 가능합니다.
· 폭언, 욕설, 비방 등은 관리자에 의해 경고없이 삭제됩니다.