문제
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를 해주는걸로 알고있는데 이렇게하면 답이 이상하게 나옵니다
자세한 설명 부탁드리겠습니다 ㅠ
안녕하세요 길벗수험서 운영팀입니다.
[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로 돌아갑니다.)
행복한 하루되세요 :)