과학적 표기법과 부동소수점을 간단히 살펴봅니다. 티스토리에서 음의 지수 표기가 문제 있어서 일부 스크린캡처한 점 감안해주세요. 모바일보다는 피시나 태블릿에서 봐야 합니다.
2024. 1. 20 최초작성
이렇게 가수의 길이를 조정함으로써, 같은 숫자도 다른 정밀도로 표현할 수 있습니다. 가수가 길면 길수록, 즉 유의미한 숫자가 많으면 많을수록, 그 숫자는 더 정밀하게 표현됩니다. 이는 부동 소수점에서 매우 중요한 개념으로, 숫자를 처리하고 저장하는 데 있어서 정확도와 메모리 사용량 사이의 균형을 맞추는 데 사용됩니다. 부동 소수점은 실수를 과학적 표기에 따라 표기한 것입니다.
컴퓨터 메모리와 처리 능력의 한계 때문에, 모든 숫자를 무한한 정확도로 저장할 수는 없습니다. 따라서 부동 소수점 수를 사용할 때, 숫자의 크기(지수)와 정확도(가수) 사이에서 균형을 맞추어야 합니다. 예를 들어, 더 큰 범위의 숫자를 표현하기 위해 정확도를 희생할 수 있으며, 더 높은 정확도를 위해 숫자의 범위를 제한할 수도 있습니다.
앞에서 살펴본 범위와 정확도 사이에서의 균형은 이진수에서도 중요합니다. 숫자와 숫자의 계산적 표현을 다룰 때는 숫자가 메모리에서 얼마나 많은 공간을 차지할지 항상 염두에 두어야 합니다. 위의 예에서 보았듯이 부동 소수점이 아닌 숫자의 표현은 실현 불가능한 수의 자릿수를 차지할 수 있으므로 0.000 000 000 000 000 000 000 000 000 000 000 000 663을 2진수로 저장하려면 몇 자릿수가 필요한지 상상해 보십시오.
2진 부동 소수점 수는 2, 3, 4 바이트로 구성될 수 있습니다. 여기에선 2바이트 즉 16비트인 경우를 살펴봅니다.
이 경우 가수(Mantissa) 부분은 10비트이고 지수(Exponent) 부분은 6비트입니다. 부동소수점으로 실수를 저장하면 같은 메모리에 더 많은 숫자를 저장할 수 있습니다.
1. 가수(Mantissa)
- 가수는 숫자의 실제 값을 나타내며 숫자의 정밀도(정확도)를 결정합니다.
- 이 경우, 부동 소수점 수의 첫 10비트가 가수로 사용됩니다.
2. 지수(Exponent)
- 지수는 숫자의 스케일(크기)를 나타내며 숫자가 얼마나 크거나 작은지를 나타내며, 소수점의 위치를 조정하는 데 사용됩니다.
- 마지막 6비트가 지수로 사용됩니다.
0.1을 2진수로 변환할 때, 10자리의 정밀도로 계산하면 결과는 '0001100110' 입니다. 이 과정을 간단히 설명하면 다음과 같습니다.
각 단계에서 소수점 이상의 값은 기록후 버리고 소수점 이하 값에 2를 곱하는 것을 반복합니다.
1. 0.1 * 2 = 0.2
첫 번째 숫자는 0입니다 (0.2에서 소수점 앞의 수)
2. 0.2 * 2 = 0.4
두 번째 숫자는 0입니다
3. 0.4 * 2 = 0.8
세 번째 숫자는 0입니다
4. 0.8 * 2 = 1.6
네 번째 숫자는 1입니다
5. 0.6 * 2 = 1.2
다섯 번째 숫자는 1입니다
6. 0.2 * 2 = 0.4
여섯 번째 숫자는 0입니다
7. 0.4 * 2 = 0.8
일곱 번째 숫자는 0입니다.
8. 0.8 * 2 = 1.6
여덟 번째 숫자는 1입니다.
9. 0.6 * 2 = 1.2
아홉 번째 숫자는 1입니다.
10. 0.2 * 2 = 0.4
열 번째 숫자는 0입니다.
이 과정은 무한 반복되기 때문에 2진수에서 0.1은 정확하게 표현될 수 없습니다. 대신, 컴퓨터는 이러한 값을 특정 길이로 잘라서 근사치로 사용하며, 이로 인해 부동 소수점 수에서 정밀도 문제가 발생합니다. 앞에서 계산하여 얻은 0001100110는 2진수에서 0.1의 근사치입니다.
2진수 체계에서 실수를 표현하기 위해 2를 곱하는 이유는 2진수가 기본적으로 2를 기반으로 하는 숫자 체계이기 때문입니다. 십진수에서 소수점 아래의 각 자리수는 10의 거듭제곱(예: 1/10, 1/100, 1/1000 등)으로 표현되는 반면, 2진수에서는 2의 거듭제곱(예: 1/2, 1/4, 1/8 등)으로 표현됩니다. 예를 들어, 2진수 0.1은 1/2, 0.01은 1/4를 의미합니다.
2를 곱하는 것은 실질적으로 소수점을 오른쪽으로 한 칸 이동시키는 것과 같습니다. 이는 십진수에서 10을 곱하는 것과 유사합니다. 소수점 이동을 통해, 소수점 아래 첫 번째 자리수를 소수점 위로 올릴 수 있습니다. 소수점 위로 올라온 숫자(0 또는 1)는 이진수에서의 해당 자리수를 결정합니다.
참고
'요즘 공부하는 것들' 카테고리의 다른 글
visionOS에 대한 휴먼 인터페이스 가이드라인(Human Interface Guidelines) 번역 (23) | 2024.02.11 |
---|---|
프로그래밍 언어에서 인덱스가 0부터 시작해야 하는 이유 Why numbering should start at zero (26) | 2023.12.24 |
Julia에서 딥러닝 하려면 필요한 것 (0) | 2023.12.02 |
요즘 공부하는 것들 - Julia, socket (0) | 2023.11.16 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!