정수 표현시에 반올림을 적용하면 0~4까지는 내림, 5~9까지는 올림수가 된다.

한 예로 1의자리 반올림을 하면

14 - > 10

15 - > 20

이와 같이 변한다. 하지만 소수점은 어떻게 적용이 될까??

소수점 이하 첫째자리까지만 표시하도록 해보았다.


float a = 0.54;

float b = 0.55;

float c = 0.56;


printf("%f\n", a);      - a1

printf("%0.1f\n", a);  - a2

printf("%f\n", b);      - b1

printf("%0.1f\n", b);  - b2

printf("%f\n", b);      - c1

printf("%0.1f\n", b);  - c2


이때 출력값은

a1 : 0.54    a2: 0.5 (예상 결과 0.5)

b1 : 0.55    b2 : 0.5 (예상 결과 0.6)

c1 : 0.56    c2 : 0.6 (예상 결과 0.6)


어째서 b의 결과는 예상 결과와 상이한 것일까?

0.55를 소수 첫째자리까지 반올림하면, 두번째 자리 5가 올림되어 0.6되는게 아닌가?


해석.

2진수 컴퓨터 체계에서 숫자는 정수부분과 실수부분으로 나뉜다.

이때 정수부분 표현은 어떤수라도 표현 가능 범위에만 있으면 100% 정확하게 표현이 가능하다.

하지만 실수 부분은 그렇지 않은데 

0.5 = 0.1 (2)

0.25 = 0.01 (2) 와 같이 2진수로 맞아 떨이지게 계산되는 수가 있는가 하면

0.55 = 0.1000110011001100....(2)와 같이 떨어지지 않는 수도 있다

즉 2진수 체계에서는 실수를 정확하게 표현할 수 없다.


위의 예를 돌아가 보자.

입력 값들은 실제 다음과 같은 값으로 저장되어 있다.

0.54 = 0.539559..... (출력시에는 0.54로 보임)

0.55 = 0.5487....     (출력시에는 0.55로 보임)

0.56 = 0.558......     (출력시에는 0.56으로 보임)

즉 가장 근사한 값일 뿐이지 실제 0.55를 입력했다고해서 메모리에 0.55가 정확히 저장되어 있지 않는다.

그렇기 때문에 소수점 첫째자리까지 출력한다고 하면.

입력한 0.54 -> 0.5가 되는 것이 아니라 0.539559 -> 0.5가 되고

입력한 0.55 -> 0.6이 되는 것이 아니라 0.5487 -> 0.5가 되고

입력한 0.56 -> 0.6이 되는 것이 아니라 0.558 -> 0.6이 되는 것이다.



결론.

컴퓨터에서 소수점 이하 출력시에는, 입력한(눈에 보이는) 값 자체로 반올림을 따지면 결과가 다르고,

실제 저장된 값을 확인해 봐야 한다.


Posted by Yann'
,