책 내용 질문하기
실수형 float 대해 이해가 가지 않아 문의합니다.
도서
2019 시나공 정보처리기사 실기(산업기사포함)
페이지
115
조회수
167
작성일
2019-06-11
작성자
탈퇴*원
첨부파일

문제 

public class Problem{

public static void main(String[] args){

float a = 123456789.0e-5f ;

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

}

}

 

이문제에서 대체 왜 결과 값이 

1234.567871  1.234568e+03 

이런식으로 나오는지 이해가 가지 않습니다.

1234.567871답에서는 어떻게 71이라는 숫자가 뒤에 붙었는지와 1.234568e+03은 어떻게 뒤에 8이 붙었는지 이해가 가지 않습니다.

 

54페이지에 있는 예제도 이해가 잘 가지 않습니다.

#includ <stdio.h>

main(){

int i =250 ;

float a = 125.23f ;

float b = 314.1592e+5 ;

printf("a = %8.2f, b= %e\n",a,b) ; 

// 여기서 제가 알기로는 8은 정수형 자리 .뒤에있는 숫자 2는 소수점 자리수를 의미하는 걸로 알고 있는데 제가 알고있는 것과 너무 달라 이해가 가지 않습니다. 

... }

 

 

 

113페이지에 문제 3번에 부정 기호도 이해가 가지 ㅇ낳습니다.

문제 

public class Problem{

public static void main(String[] args){

byte a= 15, b= 19 ;

System.out.printf("%d\n", ~a) ; 

.... } 

여기서 해석을 보면 2의보수를 치하라고 했는데 2의 보수를 치하기전에 1의보수를 치한후 2의보수를 해야하는걸로 알고 있습니다.

1의 보수는 1값은 0으로 바꾸어주고 0값은 1값으로 바꾸어주는걸로 알고 있고 2의 보수는 1의 보수에서 +1를 해주는걸로 알고있는데 이렇게하면 답이 이상하게 나옵니다 

 

자세한 설명 부탁드리겠습니다 ㅠ

 

답변
2019-06-12 14:08:21

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

 

[float 문제]

%f로 출력하면 234.567890으로 표시되어야 하는데, 지수를 실수로 표현할 때 부족한 자리수 변환 시 정규화 과정의 오차로 인해 예상과 다른 값이 표시됩니다.

이로 인해 예상과 다른 결과가 표시되도록 자리수가 부족한 표현은 시험에 출제되지 않을 것으로 예상됩니다. 그러니 적용 원리에 맞는 형태만 파악해 두세요.

 

%e로 출력했을 때는 1.23456789e+03 이 원래 출력되어야 할 수입니다. 하지만 C나 JAVA에서는 소수점 이하 자리의 기본출력이 6자리까지만 된다는 것을 기억해두세요. 때문에 7번째 짜리인 8에서 반올림되어 6번째 자리인 7이 +1이 되어 1.234568e+03이 되는 것입니다.

 

 

[54쪽 %8.2f]

앞의 8은 전체 자리수를 의미합니다. 소수점 자리수까지 포함하는 전체 자리수죠.

125.23은 소수점을 포함하여 총 6자리를 차지하게 됩니다. 때문에 앞의 2칸을 비운채 "ㅁㅁ123.23"을 적어줘야 하죠.

 

참고로 전체 자리수가 출력하려는 수가 차지하는 자리수보다 적을 때는 무시됩니다.

즉, 123.456789 를 %2.1f로 출력하려고 한다면, 뒤의 .1만 적용되어 123.5가 전부 출력되죠.(둘째 자리에서 반올림)

 

 

[113쪽 not 비트연산]

...뭔가 착오하고 계신 것이 있는 것 같습니다.

1의 보수화 방법 : 1을 0으로, 0을 1로 치환

2의 보수화 방법 : 1을 0으로, 0을 1로 치환 후, 1을 더함

입니다.

2의 보수화가 1의 보수를 한 다음에 1을 더하는 것은 맞지만,

2의 보수화가 1의 보수를 한 다음에 2의 보수화를 한다는 것은 옳지 못한 표현입니다.

 

때문에 컴퓨터에 음수로 표시된 2의 보수를 사용자가 읽을 수 있는 일반 10진수로 표현하기 위해서는

원래 수로 돌리기 위해 2의 보수화를 진행한 후 음수 표시(-)를 해주시면 됩니다.

(참고로 A -> 2의 보수화 -> B -> 2의 보수화 -> A 로, A를 2의 보수화한 수는 다시 2의 보수화할 경우 A로 돌아갑니다.)

 

행복한 하루되세요 :)

  • 관리자
    2019-06-12 14:08:21

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

     

    [float 문제]

    %f로 출력하면 234.567890으로 표시되어야 하는데, 지수를 실수로 표현할 때 부족한 자리수 변환 시 정규화 과정의 오차로 인해 예상과 다른 값이 표시됩니다.

    이로 인해 예상과 다른 결과가 표시되도록 자리수가 부족한 표현은 시험에 출제되지 않을 것으로 예상됩니다. 그러니 적용 원리에 맞는 형태만 파악해 두세요.

     

    %e로 출력했을 때는 1.23456789e+03 이 원래 출력되어야 할 수입니다. 하지만 C나 JAVA에서는 소수점 이하 자리의 기본출력이 6자리까지만 된다는 것을 기억해두세요. 때문에 7번째 짜리인 8에서 반올림되어 6번째 자리인 7이 +1이 되어 1.234568e+03이 되는 것입니다.

     

     

    [54쪽 %8.2f]

    앞의 8은 전체 자리수를 의미합니다. 소수점 자리수까지 포함하는 전체 자리수죠.

    125.23은 소수점을 포함하여 총 6자리를 차지하게 됩니다. 때문에 앞의 2칸을 비운채 "ㅁㅁ123.23"을 적어줘야 하죠.

     

    참고로 전체 자리수가 출력하려는 수가 차지하는 자리수보다 적을 때는 무시됩니다.

    즉, 123.456789 를 %2.1f로 출력하려고 한다면, 뒤의 .1만 적용되어 123.5가 전부 출력되죠.(둘째 자리에서 반올림)

     

     

    [113쪽 not 비트연산]

    ...뭔가 착오하고 계신 것이 있는 것 같습니다.

    1의 보수화 방법 : 1을 0으로, 0을 1로 치환

    2의 보수화 방법 : 1을 0으로, 0을 1로 치환 후, 1을 더함

    입니다.

    2의 보수화가 1의 보수를 한 다음에 1을 더하는 것은 맞지만,

    2의 보수화가 1의 보수를 한 다음에 2의 보수화를 한다는 것은 옳지 못한 표현입니다.

     

    때문에 컴퓨터에 음수로 표시된 2의 보수를 사용자가 읽을 수 있는 일반 10진수로 표현하기 위해서는

    원래 수로 돌리기 위해 2의 보수화를 진행한 후 음수 표시(-)를 해주시면 됩니다.

    (참고로 A -> 2의 보수화 -> B -> 2의 보수화 -> A 로, A를 2의 보수화한 수는 다시 2의 보수화할 경우 A로 돌아갑니다.)

     

    행복한 하루되세요 :)

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