숫자, 특히 부동소수점과 연산에 대한 내용 정리.
부동소수점
기본 용어
실수 = Real Number
= 유리수 + 무리수
유리수 = Rational Number
정수의 비로 표현 가능한 숫자.
무리수 = Irrational Number
정수비로 나타낼 수 없는 숫자.
Ex) 3.141592653589793..., √2
부동소수점 표현 bit 구성
최상위 비트(MSB, Most Significant Bit) = 수의 부호(Sign)
지수부(exponent, ) = 2의 거듭제곱을 표시하는 부분
가수부(mantissa, 假數部) = 상용로그의 값에서 0과 같거나 0보다 크고 1보다 작은 소수
예) 십진수 -118.625 를 IEEE 754 표준으로 표현하면
풀이과정
1) -118.625 의 절대값을 2진수로
118.625 = 1110110.101
118을 2진수로 = 1110110
0.625를 2진수로 = 0.101
2)소수점을 왼쪽으로 이동, 1만 남긴다.
1110110.101 = 1.110110101×2⁶
부동소수점 수를 정규화
= 가수부와 지수부를 분리한다.
(정규화되면 소수점 왼쪽 수는 무조건 항상 1, 신경X 표현X hidden bit라고 부름)
3)소수점 오른쪽을 23비트가 되도록 0으로 채움
1.110110101×2⁶
=> 1101 1010 1000 0000 0000 000 (가수부)
4)IEEE 표준에서 32비트의 Bias 는 127
Bias 127 의 2진수는 0111 1111
Bias 127 에 소수점의 지수6(2⁶)을 더한다.
= 133
133을 2진수로 변환하면
= 1000 0101 (지수부 8비트)
5)부호 1비트, 지수 8비트, 가수 23비트를 합친다.
= 1_100 0010 1_110 1101 0100 0000 0000 0000
= -118.625
단정밀도(single precision)
float
실수를 32비트로 처리
부호 1비트, 지수부 8비트, 가수부 23비트
배정밀도(double precision)
double
실수를 64비트로 처리
부호 1비트, 지수부 11비트, 가수부 52비트
Float Type
지수부 8비트로 Bias127 제외하고 128비트 큰 숫자까지 담을 수 있지만,
가수부가 23비트 자리수로 제한돼있기 때문에 정밀도는 굉장히 떨어질 수 있다.
16,777,216 까지의 정수부 정밀도를 지원함.
지수부 bit 자리수가 넘쳐 정규화된 hidden bit 1 까지 포함해서 정밀도를 보장하는 최대 수.
또, 가수부 자리를 모두 써버렸기 때문에 16,777,216.1234 처럼 뒤에 붙은 0.1234 역시 할당을 시도해도 메모리에 담아내지 못함.
대신 배정밀도(double precision) 타입을 사용하면, 가수부 비트 수가 더 많기 때문에 정밀도를 보장하는 최대 수가 더 높음.
참고 자료
IEEE 754, 부동소수점 표현 표준
IEEE = Institute of Electrical and Electronics Engineers(전기 전자 기술자 협회)
https://ko.wikipedia.org/wiki/IEEE_754
부동소수점 연산
https://en.wikipedia.org/wiki/Floating-point_arithmetic
실수 자료형의 오차
https://dojang.io/mod/page/view.php?id=738
컴퓨터에서의 실수 표현
https://gsmesie692.tistory.com/94
https://en.wikipedia.org/wiki/Single-precision_floating-point_format
https://en.wikipedia.org/wiki/Double-precision_floating-point_format
추천서적
*파트너스 활동을 통해 수수료를 제공받을 수 있음
'프로그래밍 이야기' 카테고리의 다른 글
Unity 게임 개발을 위한 Visual Studio 2022 Community 설치 (0) | 2022.01.23 |
---|---|
깃헙 코파일럿 Copilot 을 써보려고 했다 (0) | 2021.12.12 |
[책리뷰] 읽기 좋은 코드가 좋은 코드다 (1부, 2부 리뷰) (0) | 2021.04.04 |
A Tour of C++ : 11장 컨테이너 (0) | 2019.11.28 |
[VS] Visual Studio 2017 언어 변경, 로그 영어로 출력하기 (0) | 2019.11.24 |
A Tour of C++ : 10장 입력과 출력 (0) | 2019.11.23 |
A Tour of C++ : 9장 문자열과 정규 표현식 (0) | 2019.11.18 |