숫자 123을 표현하는 방식에는 아래와 같이 여러가지가 있다.
|
이 중 우리가 일상적으로 사용하는 숫자 표현 방식은 10진수 이다.
그러나 컴퓨터는 기본적으로 2진수를 사용한다.
13 => 1101과 같이 이진수로 표현하기 쉬운 수도 있지만,
0.3 => 0.0100110011......(0011의 무한 반복) 과 같이 이진수로 표현하지 못하는 소수가 발생한다. 이와 같은 경우 어쩔 수 없이 컴퓨터에는 가장 근사치의 값이 저장된다. 이 근사 값을 저장하는 방법에는 고정 소수점과 부동소수점 두가지가 있다.
고정 소수점
- 정수를 표현하는 비트 수와 소수를 표현하는 비트 수를 미리 정해 놓고 해당 비트 만큼만 사용해서 숫자를 표현하는 방식
예) 실수 표현에 '4byte(32bit) = (부호) 1bit + 정수 16bit + 소수 15bit'를 사용하도록 약속해 놓은 |
-- 고정 소수점의 문제점 --
- 예로든 -118.625는 32bit안에 모두 표현이 되었지만 더 큰자리의 수를 표현할때 아래와 같은 문제가 나타난다.
- 정수를 표현하는 bit를 늘리면, 큰 숫자를 표현할 수 있지만 정밀한 숫자를 표현하긴 힘들다.
- 반대로 소수를 표현하는 bit를 늘릴 경우, 정밀한 숫자를 표현할 수 있지만 큰 숫자를 표현하지 못한다.
이런 문제를 해결하기 위해서 소수점 위치를 고정하지 않고 둥둥 떠 다닐 수 있도록 하는 부동 소수점을 사용한다.
부동 소수점
(부동 소수점방식은 여러가지가 있지만,
일반적으로 사용하고 있는 IEEE(전기전자기수자협회)에서 표준으로 제안한 방식으로 설명)
부동소수점(floating point) 방식은 이진수로 미처 표현하지 못한 실수를 컴퓨터상에서 근사치의 값으로 표현할 때 정수와 소수로 나누어 소수점의 위치를 고정하지 않고, 그 소수점의 위치를 나타내는 지수 부분(exponent)과 유효숫자를 나타내는 가수 부분(fraction/mantissa)으로 나누어 표현한다.
우선 고정 소수점으로 나타낸 -118.625 = (0)0000000001110110.101000000000000 을 부동 소수점 방식으로 변환하는 방법은 다음과 같다.
이 방식에 따라서 -118.625를 기록하면 아래와 같다.
|
이 설명을 수식으로 나타내면 아래와 같다.
-- 부동 소수점 방식의 한계 ( 정확도 문제 ) --
부동 소수점 방식을 사용하면 고정 소수점 방식보다 훨씬 더 많은 범위까지 표현할 수 있어 많이 이용된다.
하지만 부동 소수점 방식에 의한 실수의 표현은 근삿값으로 표현되므로 항상 오차가 존재하며,
부동 소수점으로 표현된, 오차가 존재하는 실수를 이용해 실행한 연산 역시 실제 수학적 연산을 정확히 표현하지 못하는 것은 여러가지 문제를 낳는다.
부동 소수점 방식에서의 오차는 앞서 살펴본 공식에 의해 발생한다.
이 방법을 사용하면 표현할 수 있는 범위는 늘어나지만, 10진수를 정확하게 표현할 수는 없게 된다.
따라서 컴퓨터에서 실수를 표현하는 방법은 정확한 표현이 아닌 언제나 근사치를 표현 할 뿐임을 항상 명심해야 한다.
'Java' 카테고리의 다른 글
[자바의 의존성] 메이븐과 의존성 관리도구 (0) | 2020.05.13 |
---|---|
메모리 4영역. (0) | 2020.05.13 |
기계어와 어셈블리언어 고급언어. (0) | 2020.05.13 |
절차지향 언어와 객체 지향 언어의 차이는? (0) | 2020.05.13 |
디자인패턴(ㅇ), 스트래티지 패턴( x ) (0) | 2020.05.13 |