컴퓨터에서 실수를 표현하는 방법은 복잡하다. 실수와 정수 마찬가지로 2진수로만 표현을 해야하기 때문인데,
따라서 실수의 표현 방식은 두가지가 있다.
1. 고정 소수점(fixed point) 방식
2. 부동 소수점(floating point) 방식
고정 소수점(fixed point) 방식
실수를 정수부와 소수부로 나눌 수 있다.
그래서 실수를 표현할 때 소수부의 자릿수를 미리 정하고, 고정된 자릿수의 소수를 표현하는 것이다.
하지만 정수부와 소수부의 자릿수가 정해져있어서 표현할 수 있는 범위가 매우 적다는 단점이 있다.
저장할 크기보다 저장할 값이 작다면 남은 공간이 낭비되는 문제가 있다.
그래도 연산은 빠르지만 일반적인 상황에서는 비효율적이다.
부동 소수점(floating point) 방식
실수를 가수부와 지수부로 나누어서 표현한다.
고정 소수점 방식은 표현 범위가 매우 작았지만, 부동 소수점 방식은 매우 큰 실수까지 표현이 가능하다.
±(1.가수부)×2^지수부-127
대부분은 부동 소수점 방식으로 실수를 표현한다.
- 정규화 : 정수부에 유의미한 한 자리 수를 정수부에 남기고 전부 소수부로 넘김 * 10^n
컴퓨터는 2진수로만 표현이 가능하므로 2진정규화를 해야한다.
예를들어 4.625의 값을 2진수로 바꿔보자.
정수부 4는 0100으로 바꿔줄 수 있다.
소수부 0.625를 2진수로 바꿔주려면 다음을 먼저 알아야한다.
0.1자리는 0.5 / 0.01자리는 0.25 / 0.001자리는 0.125
즉, 0.625는 0.5 + 0.125로 표현할 수 있고 이를 2진수로 나타내면 0.101이 된다.
따라서 4.625의 2진수는 0100.1010이 된다.
이제 2진수를 정규화 시킬텐데, 먼저 정수부에 유의미한 한자리 수만 남기고 전부 소수부로 넘긴다.
1.00101 * 2^2 로 나타낼 수 있다.
이제 정규화시킨 2진수를 부호부(1)/지수부(8)/가수부(23)으로 나타내준다.
- 부호부(1) : +는 0, -는 1로 나타냄. 1자리수
- 지수부(8) : 2^지수부에서 지수부를 2진수로 변환한 값 + 127(2진수). 8자리 수
- 가수부(23) : 정규화시킨 소수부 그대로 가져다 넣음. 값이 너무 길어지면 짤리게되는데 이로 인해 오차가 발생.
따라서 다음과 같이 나타낼 수 있다.
부호부(1) / 지수부(8) / 가수부(23)
0 / 10000001 / 00101000000000000000000
즉, 01000000100101000000000000000000(=4.625)의 값으로 나타낼 수 있는 것이다.
C++ 부동 소수점 표현 방식
C++에서 부동 소수점을 두 가지 방식으로 표현한다.
1. 3.14, -45.6과 같이 소수 부분을 가지는 아라비아 숫자로 표현
2. e 또는 E를 사용하여 지수 표기법으로 표현
부동 소수점 방식의 오차
부동 소수점을 통해 실수의 더 많은 범위까지 표현할 수 있다.
하지만 이러한 방식에 의한 실수 표현은 항상 오차가 존재한다는 단점이 있다.
부동 소수점 방식에서의 오차는 부동 소수점 공식에 의해 발생한다.
부동 소수점 공식을 사용하면 표현할 수 있는 범위가 늘어나지만, 10진수를 정확하게 표현할 수 없는 문제가 있다.
때문에 컴퓨터에서 실수를 표현하는 방법은 정확한 표현이 아니라 근사치만 표현하는 것임을 기억하자.
그래서 실수를 가지고 수행하는 모든 연산에는 언제나 작은 오차가 존재하게 되는 것이다.
'Study' 카테고리의 다른 글
5/11_GameMode / 플레이어 점프 (0) | 2023.05.11 |
---|---|
5/10_부동소수점 정규화 / 캐릭터 이동 수정 (0) | 2023.05.10 |
5/9_캐릭터 시점 움직이기 (0) | 2023.05.09 |
5/8_캐릭터 구현 (0) | 2023.05.08 |
5/4_Asset 이주 / Character 알아보기 (0) | 2023.05.04 |