부동소수점이란


부동소수점을 설명하기 앞서 고정소수점에 대해 간단히 설명하겠다.

고정소수점이란 각각 정수와 소수를 표현하는 비트의 수를 미리 정해 놓고 정해진 비트 만큼만 사용해서 수를 표현하는 방식이다.

 

부동소수점이란 컴퓨터가 실수를 표현할 때 사용하는 방법 중 하나로, 고정소수점 방식과는 다르게 소수점의 위치를 고정하지 않고 소수점의 위치를 나타내는 수를 따로 적어 표현한다.

※유효숫자를 나타내는 가수와 소수점의 위치를 나타내는 지수로 부동 소수점을 표현한다.

 

예를 들어 123.4 를 고정소수점, 부동소수점으로 나타내보면

고정소수점으로 표현 하면 123.4 한 가지 표현만 가능.

부동소수점 방식의 지수와 가수를 이용하면 [1.234 * 10^2], [12.34 *10^1] 등 여러 방식으로 표현이 가능하다.


유한 정밀도


파이썬에서 나타내는 부동소수점 수는 값이 길어질수록 부정확해진다.

 

예를 들어 파이썬에서 각각 2/3 연산과 5/3 연산을 해보면

print(2/3)
print(5/3)

>>0.6666666666666666
>>1.6666666666666667

위와 같이 출력된다.

사람이 하는 연산이라면 두 값 모두 끝자리가 6으로 반복되겠지만 파이썬은 그렇지않다.

이러한 현상이 발생하는 이유는 컴퓨터 메모리 용량이 한정되어 있고 파이썬이 한 숫자에 대해 저장하는 정보 용량을 제한하기 때문이다.

따라서 위의 값들은 제한된 양의 메모리에 실제로 저장할 수 있는 각 연산(2/3), (5/3)의 답에 가장 가까운 값이다.

 

사람이 생각하기에 2/3과 0.6666666666666666의 차이는 작아보일 수 있지만 실제 계산에서 0.6666666666666666를 사용할 떄 일어날 오류는 심각하다.

5/3은 1+(2/3)과 같은 값이지만 파이썬으로 계산을 해보면

print(1+(2/3))
print(5/3)

>>1.6666666666666665
>>1.6666666666666667

위와 같이 서로 다른 값이 나온다.

※계산을 더 할수록 오류는 더 커지고, 특히 매우 큰 수와 매우 작은 수를 연산하면 더 커진다.


부동소수점이 갖는 이러한 문제를 항상 인지하고 있어야 한다.

컴퓨터는 위에서 말한 것처럼 메모리에 한계가 있기 때문에 이 문제를 완벽히 해결할 방법은 없다.

부동소수점간의 연산에서는 최대한 작은 수부터 계산하는 것이 오류를 최소화하는 유일한 방법이다.

 

+ Recent posts