_

Always be tactful

Insights (종료)/For KR

[CS] 1.1 + 0.1 != 1.2인 이유

funczun 2024. 12. 14. 12:14
컴퓨터에서 실수는 어떻게 저장될까?

 컴퓨터는 모든 정보를 2진수로 표현한다. 실수 역시 2진수로 표현해 RAM에 저장하게 되는데, 이 과정에서 실수 값 일부가 손실되어 정확한 값이 아닌 근삿값을 저장하게 된다.

 

 예를 들어, 0.1을 2진수로 표현하면 0.00011001100110011...이라는 무한소수가 된다. 숫자 하나를 저장하는 bit는 통상적으로 32비트이므로 뒷부분이 잘려나가게 되고, 이로 인해 오차가 발생하여 실제로 저장되는 값은 0.10000000000000000555...가 되어 미세한 오차를 발생시킨다.


자료형 double을 활용하자.

 C언어라면 double 자료형을 활용해서 숫자 하나당 64비트를 배정하여 오차를 급격하게 줄일 수 있지만 메모리 용량이 2배가 필요하다는 단점이 있다. (파이썬의 경우 float은 애초에 64비트 부동소수점으로 처리된다.)


일정 오차 범위를 허용하자.

 이 방법은 아주 미세한 오차 범위를 허용하며, 만약 오차 범위가 주어진 임계값보다 작다면 두 숫자가 동일하다고 간주한다.

epsilon = 1e-9
abs((1.1 + 0.1) - 1.2) < epsilon  # True

정수로 바꿔서 계산하자.

 예를 들어 1.1과 0.1이라면, 각각 10을 곱해 정수로 만든 뒤 계산 후에 다시 10으로 나누는 방법을 사용할 수 있다. 오차 발생을 예방하지만 소수점 이하 자릿수가 매우 길다면 곱해야 하는 값이 매우 커질 수 있다는 단점이 있다.

728x90