https://www.acmicpc.net/problem/4781
위의 문제를 풀던 중 이상한점을 발견했다. input이 소수점 둘째자리 double 형태로 들어오기 때문에 100을 곱해서 int로 변환하려고 했다. 하지만 이 방식은 정확하지 않았다.
double a = 0.01;
System.out.println((int)a*100); //0
//1을 반환해야 할거 같지만 0을 반환한다
System.out.println((int)(a*100 + 0.5)); //1
//원하는 값을 얻기 위해서 0.1 이상의 값을 더해준다. 이를 부동소수점 오차라고 한다
1비트는 0과 1을 표현한다. 4비트는 2^4개의 숫자를 표현할 수 있다.
정수는 양수와 음수로 이루어져 있다. 양수와 음수를 모두 표현하기 위해 맨 앞 비트는 부호를 위해 사용한다.
따라서 32비트(4바이트)로 이루어진 int형의 경우 -2^31 ~ 2^31-1 까지의 수를 표현할 수 있는 것이다.
실수도 마찬가지 아닌가? 실수는 정수부와 소수부로 이루어져 있다.
정수부를 표현했던 것처럼 소수부도 표현해볼 수 있다. 하지만 이 경우, 오류가 발생한다.
<aside> 💡 1.9 → 1.1001 1.41 → 1.100 + 1?
</aside>
명백히 다른 두 실수가 같은 값으로 표현될 수 있다. 따라서, 다른 방법을 도입했다.
결국 정수를 이진수로 표현하는 과정은 10진수를 2로 계속 나눈 후 나머지를 뒷자리부터 붙이는 방식이었다.