부동소수점 연산과 이진수 표현
부동소수점의 본질을 이해하기 위해서, 십진수와 이진수의 차이를 먼저 살펴볼 필요가 있다. 우리가 일상에서 사용하는 십진수는 10개의 숫자(0-9)를 사용하는데 반해, 컴퓨터는 이진수 시스템, 즉 0과 1을 사용한다.
십진수와 이진수
십진수에서 소수를 표현하는 것은 매우 자연스럽게 이루어진다. 예를 들어, 0.5는 5 x 10^(-1)로 쉽게 표현할 수 있다. 하지만 이진수에서는 모든 숫자를 2의 거듭제곱 형태로 표현해야 한다. 예를 들어, 0.5는 이진수로 0.1로 표현된다. 이는 (1 x 2^(-1))와 같다.
소수 0.1의 이진수 표현
문제는 0.1 같은 소수를 이진수로 표현할 때 발생한다. 십진수 0.1은 (1 x 10^(-1))로 표현되지만, 이진수에서는 정확하게 표현할 수 없다. 이는 0.1이 이진수로 0.0001100110011... 처럼 무한히 반복되기 때문이다. 이 과정에서 무한히 반복되는 숫자를 잘라내서 근사치로 저장하게 되고, 이 때문에 작은 오차가 생긴다.
부동소수점 연산의 오차
부동소수점 연산에서 발생하는 오차의 원인은 이진수와 십진수 간의 표현 방식의 차이 때문이다. 이런 작은 오차들이 연산 과정에서 쌓여서 정확한 결과를 얻기 어렵게 만드는 것이다. 이러한 개념을 더 깊이 이해하려면, 부동소수점 표준인 IEEE 754에 대해 공부해보는 것도 도움이 된다.
고정소수점과 부동소수점
고정소수점 연산은 부동소수점 연산보다 정확도가 높다. 예를 들어, 100으로 나누면 소수점 아래 자리 수가 줄어들면서 정밀도가 낮아지지만, 이진수로 표현할 때 오차가 적어져서 연산 결과가 더 정확하게 나온다. 그래서 100으로 나눈 후 연산하면 부동소수점 오차를 피하고 보다 안정적인 결과를 얻을 수 있다.
올림 후 이진수로 저장되는 과정
부동소수점을 올림했을 때 부동소수가 되는 이유는 그 값이 정수로 끝나지 않기 때문이다. 예를 들어, 0.1을 올림하면 1이 되지만, 부동소수점 연산에서는 0.1을 이진수로 정확하게 표현하지 못해. 그래서 이진수로 변환하면 작은 오차가 생긴다. 이 오차가 쌓이면 연산 결과에서 예상치 못한 소수가 나타날 수 있다. 따라서 부동소수점을 올림했을 때도 그 값이 이진수로 저장될 때 미세한 오차가 남아 있으면 부동소수가 되는 것이다.
참고 자료
부동소수점 연산과 관련하여 더 깊이 이해하기 위한 참고 자료는 다음과 같다:
'Java' 카테고리의 다른 글
apt로 설치한 docker update하기 (0) | 2023.06.27 |
---|---|
jsp page 접근시 session 생성 (0) | 2023.04.11 |
nginx 502 error, (0) | 2023.02.14 |
string dateformat validation yyyy-mm-dd (0) | 2022.11.24 |
restapi @dateformat (1) | 2022.11.24 |