티스토리 뷰
부동소수점
부동소수점은 컴퓨터 프로그래밍에서 실수를 표현하는 방법 중 하나입니다. C 언어에서는 부동소수점을 표현하기 위해 float과 double 두 가지 데이터 타입을 제공합니다.
- float: 4바이트 크기를 가지며, 단정밀도 부동소수점을 표현합니다.
- double: 8바이트 크기를 가지며, 배정밀도 부동소수점을 표현합니다.
부동소수점을 이해하기 위해 몇 가지 중요한 개념을 알아보겠습니다.
1. 정수와의 차이: 정수는 소수 부분이 없는 숫자를 표현하는 반면, 부동소수점은 소수점 이하의 숫자를 표현할 수 있습니다. 예를 들어, 5는 정수이지만 5.0은 부동소수점입니다.
2. 부동소수점 표현 방식: 부동소수점은 다음과 같은 형태로 표현됩니다.
부호(sign) + 가수(mantissa) + 지수(exponent)
여기서,
- 부호: 0은 양수, 1은 음수를 나타냅니다.
- 가수: 실수의 유효 숫자를 나타냅니다.
- 지수: 가수의 위치를 조정하여 실제값을 표현합니다.
이 방식을 통해 매우 큰 수나 아주 작은 수를 표현할 수 있습니다.
3. 부동소수점의 한계: 부동소수점은 실수를 근사적으로 표현하는 방식이기 때문에 정확한 값 표현이 어려울 수 있습니다. 이로 인해 두 실수를 비교할 때에는 주의가 필요합니다.
4. 부동소수점 연산: 부동소수점 연산은 정수 연산보다 오차가 발생할 가능성이 높습니다. 따라서 동등성 비교를 할 때는 == 연산자보다는 오차 범위 내에 있는지를 판단하는 방식으로 비교하는 것이 좋습니다.
5. IEEE 754 표준: 대부분의 컴퓨터 시스템은 IEEE 754 부동소수점 표준을 따릅니다. 이 표준은 부동소수점의 표현과 연산 방식을 정의합니다.
부동소수점을 사용할 때, 적절한 데이터 타입을 선택하고 정확성과 성능의 균형을 고려하여 연산을 수행하는 것이 중요합니다. 또한, 부동소수점을 사용할 때에는 오차에 대한 이해와 주의가 필요하며, 이를 처리하는 방법을 숙지하는 것이 좋습니다.
Fraction
"fraction"이란 단어는 "분수"를 의미합니다. 컴퓨터 프로그래밍에서 fraction은 일반적으로 부동소수점 숫자를 나타내는데 사용됩니다. 부동소수점 숫자는 소수점 이하의 값을 표현하기 위해 가수와 지수로 분리하여 표현하는데, 이것이 분수와 유사한 개념이라서 "fraction"이라는 용어가 사용됩니다.
분수(fraction)의 기본적인 구성은 다음과 같습니다:
분자 (Numerator)
분모 (Denominator)
예를 들어, 3/4와 같은 분수를 살펴보면, 3이 분자에 위치하고 4가 분모에 위치합니다. 이것은 '3를 4로 나눈 값'을 나타냅니다.
부동소수점을 fraction으로 표현할 때도 유사한 방식으로 분자와 분모를 사용합니다. 부동소수점을 정규화된 fraction으로 표현하면 다음과 같습니다:
value = fraction = (Fraction_Numerator / Fraction_Denominator) * base^exponent
여기서,
- Fraction_Numerator: 부동소수점의 가수에 해당하는 값입니다.
- Fraction_Denominator: 가수를 표현하는 데 사용되는 기수(base)입니다.
- base: 부동소수점 숫자의 기수를 나타냅니다. 대부분의 경우, 이 값은 2 (이진수)입니다.
- exponent: 부동소수점의 지수에 해당하는 값입니다.
예를 들어, 이진수로 표현된 0.125를 fraction으로 표현해보겠습니다. 이 값은 1/8로 나타낼 수 있습니다.
0.125 = 1/8 = (1 / 2^3)
여기서 분자는 1, 분모는 8, 기수는 2, 지수는 -3이 됩니다.
부동소수점의 fraction 표현은 부동소수점 숫자를 정확하게 표현하는데 도움이 될 수 있으며, 실수를 비교하거나 정확한 값으로 변환하는 등의 작업에 활용될 수 있습니다.
Fraction bit에 따른 정밀도
16비트 기준으로 소수를 나타낸다고 할 때, 5비트 fraction과 4비트 fraction은 소수를 표현하는 정밀도에 차이가 있습니다.
- 5비트 Fraction: 5비트 fraction은 소수점 이하 값을 표현하는데, 총 5개의 비트를 사용합니다. 이 경우, 2의 보수 표기법을 사용하여 소수를 표현할 수 있으며, 가장 작은 단위로 표현 가능한 값은 1/(2^5) 또는 1/32입니다. 이는 0.03125로 표현됩니다.
따라서, 5비트 fraction으로는 소수 부분을 최대 다섯 자리까지 표현할 수 있습니다. 예를 들어, 0.10110은 0.6875로 해석됩니다. (1/2 + 1/8 + 1/32 = 0.6875) - 4비트 Fraction: 4비트 fraction은 4개의 비트를 사용하여 소수를 표현합니다. 이 경우 가장 작은 단위로 표현 가능한 값은 1/(2^4) 또는 1/16입니다. 이는 0.0625로 표현됩니다.
4비트 fraction으로는 소수 부분을 최대 네 자리까지 표현할 수 있습니다. 예를 들어, 0.1101은 0.8125로 해석됩니다. (1/2 + 1/4 + 1/16 + 1/32 = 0.8125)
요약하면, 5비트 fraction은 더 높은 정밀도를 제공하여 더 작은 단위의 소수를 표현할 수 있습니다. 4비트 fraction은 더 큰 간격으로 소수를 표현합니다. 따라서, 정확성이 중요한 경우에는 5비트 fraction이 더 적합하고, 정밀도가 상대적으로 덜 중요한 경우에는 4비트 fraction을 선택할 수 있습니다.
Single Precision & Double Precision
Single Precision과 Double Precision은 부동소수점 숫자를 저장하는 데 사용되는 데이터 타입의 차이를 나타냅니다. 이들은 각각 32비트와 64비트 크기로 구성됩니다. Single Precision은 float 데이터 타입으로 표현되며, Double Precision은 double 데이터 타입으로 표현됩니다.
예를 들어, Single Precision과 Double Precision으로 동일한 부동소수점 숫자를 저장할 때의 차이를 살펴보겠습니다.
Single Precision (float):
Single Precision은 32비트를 사용하여 부동소수점 숫자를 표현합니다. IEEE 754 표준에 따라, 부호 1비트, 지수 8비트, 가수(유효 숫자) 23비트로 구성됩니다. 따라서 Single Precision은 단정밀도 부동소수점을 표현하며, 소수를 표현하는 데 더 적은 비트를 사용합니다.
예를 들어, Single Precision으로 소수 0.1을 표현하려면 다음과 같습니다:
Sign: 0 (양수)
Exponent: 01111011 (2^3 - 127 = 3)
Fraction: 10011001100110011001101 (앞의 1은 생략) => 1.10011001100110011001101 (2진수)
이진수를 10진수로 변환하면:
1.10011001100110011001101 (2진수) = 0.10000000149011612 (10진수)
따라서 Single Precision으로 표현된 0.1은 실제 값인 0.10000000149011612와 약간 다릅니다.
Double Precision (double):
Double Precision은 64비트를 사용하여 부동소수점 숫자를 표현합니다. IEEE 754 표준에 따라, 부호 1비트, 지수 11비트, 가수(유효 숫자) 52비트로 구성됩니다. 따라서 Double Precision은 배정밀도 부동소수점을 표현하며, 더 많은 비트를 사용하여 더 높은 정밀도를 가집니다.
예를 들어, Double Precision으로 소수 0.1을 표현하려면 다음과 같습니다:
Sign: 0 (양수)
Exponent: 01111111101 (2^9 - 1023 = -1)
Fraction: 1001100110011001100110011001100110011001100110011010 (앞의 1은 생략) => 1.1001100110011001100110011001100110011001100110011010 (2진수)
이진수를 10진수로 변환하면:
1.1001100110011001100110011001100110011001100110011010 (2진수) = 0.1 (10진수)
Double Precision으로 표현된 0.1은 실제 값인 0.1과 완벽히 일치합니다.
요약하면, Single Precision은 32비트로 단정밀도 부동소수점을 표현하여 정확성이 떨어질 수 있으며, Double Precision은 64비트로 배정밀도 부동소수점을 표현하여 더 높은 정밀도를 제공합니다. 그러나 이는 메모리 사용량과 성능 사이에서의 트레이드오프이므로, 애플리케이션의 요구사항에 따라 적절한 데이터 타입을 선택해야 합니다.
'IT > C, C++' 카테고리의 다른 글
오버라이딩 vs 오버로딩: 핵심 차이점 심층 분석 및 주의 사항 (0) | 2024.02.20 |
---|---|
[C/C++] C언어의 malloc/free와 C++의 new/delete 차이점 한번에 이해하기 (0) | 2024.02.18 |
[C] 함수포인터 기초 (0) | 2023.07.16 |
[C++] 비트단위의 데이터 저장방법 (3) | 2022.10.06 |
[C++] C++의 가상함수 동작 원리 (0) | 2022.09.16 |
- Total
- Today
- Yesterday
- rust
- Tree
- 알고리즘
- 반드시 알아야 할 자료구조
- interview question
- PS
- 솔직후기
- Interview
- 자료구조
- 기술면접
- DP
- LeetCode
- 코딩인터뷰
- coding interview
- 속초
- C++
- Problem Solving
- 러스트 기초
- 러스트 입문
- 맛집
- 러스트 배우기
- 인터뷰
- 러스트
- 내돈내산
- 트리
- algorithm
- 리트코드
- 속초 맛집
- Medium
- ProblemSolving
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |