부동소수점이란
부동소수점을 설명하기 앞서 고정소수점에 대해 간단히 설명하겠다.
고정소수점이란 각각 정수와 소수를 표현하는 비트의 수를 미리 정해 놓고 정해진 비트 만큼만 사용해서 수를 표현하는 방식이다.
부동소수점이란 컴퓨터가 실수를 표현할 때 사용하는 방법 중 하나로, 고정소수점 방식과는 다르게 소수점의 위치를 고정하지 않고 소수점의 위치를 나타내는 수를 따로 적어 표현한다.
※유효숫자를 나타내는 가수와 소수점의 위치를 나타내는 지수로 부동 소수점을 표현한다.
예를 들어 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
위와 같이 서로 다른 값이 나온다.
※계산을 더 할수록 오류는 더 커지고, 특히 매우 큰 수와 매우 작은 수를 연산하면 더 커진다.
부동소수점이 갖는 이러한 문제를 항상 인지하고 있어야 한다.
컴퓨터는 위에서 말한 것처럼 메모리에 한계가 있기 때문에 이 문제를 완벽히 해결할 방법은 없다.
부동소수점간의 연산에서는 최대한 작은 수부터 계산하는 것이 오류를 최소화하는 유일한 방법이다.
'Python' 카테고리의 다른 글
Python - 단락 평가(Short-circuit Evaluation) (0) | 2020.07.26 |
---|---|
Python - 사용자 입력(input()) (0) | 2020.07.26 |
Python - 문자열 변경 (0) | 2020.07.23 |
python- 문자열 포매팅 (0) | 2020.07.23 |
Python- 문자열(string)을 리스트(list)로, 리스트(list)를 문자열(string)로 변환 (0) | 2020.07.23 |