부동소수점
1. 개요
1. 개요
부동소수점은 컴퓨터 시스템에서 실수를 근사적으로 표현하기 위해 널리 사용되는 방법이다. 이 표현 방식은 실수를 부호, 지수, 가수라는 세 가지 구성 요소로 나누어 저장하며, 이를 통해 매우 큰 수나 매우 작은 수를 효율적으로 다룰 수 있다. 이러한 특성 때문에 부동소수점은 과학 기술 계산, 공학 시뮬레이션, 컴퓨터 그래픽스, 금융 모델링 등 광범위한 분야에서 핵심적인 역할을 한다.
현대 컴퓨팅에서 부동소수점 표현의 대부분은 IEEE 754 표준을 따른다. 이 표준은 데이터의 형식, 정밀도, 반올림 방식, 예외 처리 등을 명확히 규정함으로써 서로 다른 하드웨어와 소프트웨어 간의 호환성과 계산 결과의 일관성을 보장한다. IEEE 754는 단정밀도와 배정밀도를 포함한 여러 정밀도 수준을 정의한다.
부동소수점 표현은 필수적이지만 본질적으로 근사치이기 때문에 정밀도와 정확도에 한계가 있다. 이로 인해 반올림 오차가 누적되거나 예상치 못한 계산 결과가 나올 수 있어, 수치해석적인 주의가 요구된다. 이러한 특성은 컴퓨터 산술과 프로그래밍 언어 설계에 중요한 고려 사항이 된다.
부동소수점의 동작 원리와 한계를 이해하는 것은 정확한 수치 계산 프로그램을 작성하는 데 필수적이다. 이는 소프트웨어의 신뢰성에 직접적인 영향을 미치기 때문이다.
2. 표현 방식
2. 표현 방식
2.1. IEEE 754 표준
2.1. IEEE 754 표준
IEEE 754는 컴퓨터에서 부동소수점 숫자를 표현하고 연산하는 방법을 정의하는 국제 표준이다. 이 표준은 1985년에 처음 제정되어 현재 대부분의 프로세서와 프로그래밍 언어가 따르는 실수 연산의 근간이 되었다. 표준의 주요 목적은 서로 다른 하드웨어와 소프트웨어 간에 실수 데이터를 정확하고 일관되게 교환하고, 산술 연산 결과의 예측 가능성을 높이는 데 있다.
이 표준은 기본적으로 단정밀도와 배정밀도 형식을 규정하며, 각 형식은 부호, 지수, 가수라는 세 부분으로 구성된다. 단정밀도는 32비트를 사용하며 약 7개의 유효 십진수 자릿수의 정밀도를 제공한다. 배정밀도는 64비트를 사용하며 약 16개의 유효 십진수 자릿수의 정밀도를 가진다. 이러한 비트 할당 방식을 통해 매우 작은 수부터 매우 큰 수까지 광범위한 범위의 실수를 표현할 수 있게 한다.
IEEE 754는 일반적인 숫자 표현 외에도 특수한 값을 정의하여 예외 상황을 처리한다. 이에는 양의 무한대와 음의 무한대, 그리고 "숫자가 아님"을 의미하는 NaN이 포함된다. 또한, 지수부가 모두 0인 비정규화 수를 정의하여 0에 가까운 극히 작은 수를 표현할 때 발생하는 언더플로우 문제를 완화한다.
이 표준은 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근 등)의 결과를 정확하게 반올림하는 규칙, 다양한 반올림 모드(가장 가까운 값으로, 0 방향으로, 양의 무한대 방향으로, 음의 무한대 방향으로), 그리고 부동소수점 예외(무효 연산, 0으로 나누기, 오버플로우, 언더플로우, 정밀도 손실)의 처리 방식을 상세히 명시한다. 이를 통해 과학 기술 계산이나 금융 모델링과 같이 정밀한 수치 계산이 요구되는 분야에서 표준화된 기반을 제공한다.
2.2. 단정밀도와 배정밀도
2.2. 단정밀도와 배정밀도
단정밀도와 배정밀도는 IEEE 754 표준에서 정의하는 두 가지 기본적인 부동소수점 형식이다. 이들은 각각 32비트와 64비트의 메모리를 사용하여 실수를 표현하며, 비트 폭에 따라 표현 가능한 수의 범위와 정밀도가 결정된다. 단정밀도는 영어로 Single Precision, 배정밀도는 Double Precision이라고도 불린다.
단정밀도는 32비트를 사용하며, 이 비트들은 부호 1비트, 지수 8비트, 가수 23비트로 구성된다. 이 형식은 상대적으로 적은 메모리를 사용하지만, 표현할 수 있는 유효 숫자의 자릿수와 수의 범위가 제한적이다. 주로 컴퓨터 그래픽스나 메모리 공간이 제한된 임베디드 시스템에서 널리 사용된다.
반면, 배정밀도는 64비트를 사용하여 부호 1비트, 지수 11비트, 가수 52비트로 구성된다. 더 많은 비트를 가수부에 할당함으로써 단정밀도보다 훨씬 높은 정밀도를 제공하며, 지수부의 비트가 증가함에 따라 표현 가능한 수의 절대값 범위도 크게 확장된다. 따라서 높은 정확도가 요구되는 과학 기술 계산, 수치해석, 금융 모델링 등의 분야에서 표준적으로 사용된다.
두 형식의 선택은 애플리케이션의 정확도 요구사항과 사용 가능한 메모리, 처리 속도 간의 절충을 통해 이루어진다. 배정밀도는 단정밀도에 비해 두 배의 메모리를 소비하고 연산 속도가 상대적으로 느릴 수 있지만, 반올림 오차의 누적을 크게 줄여 더 신뢰할 수 있는 계산 결과를 보장한다.
2.3. 부호, 지수, 가수
2.3. 부호, 지수, 가수
부동소수점 표현 방식의 핵심은 하나의 숫자를 부호, 지수, 가수라는 세 가지 구성 요소로 분리하여 표현하는 데 있다. 이는 매우 넓은 범위의 실수 값을 제한된 비트(bit)로 효율적으로 나타내기 위한 방법이다.
부호는 단일 비트로 표현되며, 숫자가 양수인지 음수인지를 나타낸다. 일반적으로 0은 양수, 1은 음수를 의미한다. 지수는 숫자의 크기 또는 스케일을 결정한다. 이는 기본적으로 숫자를 과학적 표기법으로 나타낼 때의 '지수' 부분에 해당하며, 실제 메모리에 저장될 때는 편향값을 더한 형태로 저장되어 음의 지수도 표현할 수 있게 한다. 가수는 숫자의 유효 숫자 또는 정밀도를 담당한다. 이는 과학적 표기법에서 소수점 오른쪽에 위치하는 유효 숫자 부분을 나타내며, 일반적으로 저장 시 가장 앞자리의 1이 생략된 암시적 비트 방식을 사용하여 표현 효율을 높인다.
예를 들어, IEEE 754 표준의 단정밀도 형식은 총 32비트를 1비트(부호), 8비트(지수), 23비트(가수)로 할당한다. 배정밀도 형식은 64비트를 1비트(부호), 11비트(지수), 52비트(가수)로 나눈다. 지수 필드의 비트 수가 커질수록 표현 가능한 숫자의 범위가 넓어지고, 가수 필드의 비트 수가 커질수록 표현의 정밀도가 높아진다. 이 세 요소가 조합되어 컴퓨터 메모리 안에서 실수의 근사값을 구성하는 기본 구조를 이룬다.
3. 특성과 한계
3. 특성과 한계
3.1. 정밀도와 범위
3.1. 정밀도와 범위
부동소수점 표현 방식의 핵심적인 특성은 표현할 수 있는 수의 정밀도와 범위이다. 이 두 가지는 서로 트레이드오프 관계에 있으며, 사용되는 비트 수와 IEEE 754 표준에서 정의한 지수와 가수 필드의 크기에 의해 결정된다. 일반적으로 단정밀도는 32비트, 배정밀도는 64비트를 사용한다.
표현 가능한 수의 범위는 주로 지수 필드의 비트 수에 의해 결정된다. 지수 필드는 표현할 수 있는 가장 큰 수와 가장 작은 수의 크기를 정의한다. 예를 들어, 단정밀도는 약 ±10^±38 정도의 범위를, 배정밀도는 약 ±10^±308 정도의 광범위한 수를 표현할 수 있다. 이렇게 넓은 범위 덕분에 천문학적 숫자부터 미시물리학적 숫자까지 다양한 규모의 값을 다룰 수 있다.
반면, 정밀도는 가수 필드의 비트 수에 의해 결정된다. 가수 필드는 수의 유효 숫자, 즉 정밀한 값을 담당한다. 단정밀도는 대략 십진수로 7자리의 유효 숫자를, 배정밀도는 약 15~16자리의 유효 숫자를 제공한다. 이는 동일한 범위 내에서도 표현의 세밀함이 다름을 의미한다. 과학 기술 계산이나 금융 모델링과 같이 높은 정확도가 요구되는 작업에서는 배정밀도가 필수적으로 사용된다.
이러한 정밀도와 범위의 한계는 부동소수점 연산에서 반올림 오차가 누적되는 원인이 된다. 매우 큰 수와 매우 작은 수를 함께 연산할 때, 혹은 유한한 정밀도로 인해 무한한 실수를 정확히 표현할 수 없을 때 정보의 손실이 발생한다. 따라서 수치해석에서는 문제의 조건에 맞는 적절한 정밀도를 선택하고 오차의 영향을 최소화하는 알고리즘을 설계하는 것이 중요하다.
3.2. 반올림 오차
3.2. 반올림 오차
컴퓨터의 부동소수점 표현은 유한한 비트를 사용하여 무한한 실수를 표현해야 하기 때문에, 대부분의 실수 값을 정확하게 나타내지 못하고 근사값으로 저장한다. 이 과정에서 실제 값과 저장된 값 사이에 발생하는 차이를 반올림 오차(Rounding Error)라고 한다. 이 오차는 수치 계산을 수행할 때마다 누적될 수 있어, 계산 결과의 정확도에 중요한 영향을 미친다.
반올림 오차가 발생하는 주요 원인은 표현 가능한 수의 개수가 한정되어 있다는 점이다. 예를 들어, 십진법에서 1/3을 0.333...으로 무한히 반복되지만, 특정 자리수에서 반올림하여 0.333으로 저장하면 오차가 발생한다. 이진법을 사용하는 컴퓨터에서는 십진법으로 표현했을 때 유한소수인 0.1 같은 수조차 이진법으로는 무한소수가 되어 반올림 오차가 발생한다. 이러한 오차는 단정밀도보다 배정밀도를 사용할 때 상대적으로 줄어들지만, 근본적으로 제거할 수는 없다.
반올림 오차는 특히 수치 계산의 안정성을 해치는 요인으로 작용한다. 매우 큰 수와 매우 작은 수를 더하거나 빼는 경우, 또는 거의 같은 크기의 두 수를 빼는 유효숫자 소실(Catastrophic Cancellation)이 발생하면 상대 오차가 급격히 커질 수 있다. 또한, 반복적인 산술 연산을 수행하면 작은 오차가 누적되어 최종 결과에 예상치 못한 큰 오차를 만들어낼 수 있다.
이러한 문제를 완화하기 위해 수치해석에서는 알고리즘을 설계할 때 반올림 오차의 영향을 최소화하는 방법을 연구한다. 계산 순서를 조정하거나, 수치적으로 안정된 공식을 사용하며, 필요한 경우 고정소수점이나 임의 정밀도 연산 라이브러리를 활용하는 것이 일반적이다.
3.3. 정규화 수와 비정규화 수
3.3. 정규화 수와 비정규화 수
정규화 수는 IEEE 754 표준에서 정의하는 가장 일반적인 부동소수점 표현 형태이다. 정규화된 수는 가수부의 가장 높은 자리(즉, 정수 부분)가 0이 아닌 1이 되도록 지수를 조정하여 표현한다. 이는 이진법에서 가수부의 첫 번째 비트가 항상 1임을 의미하며, 이를 '암묵적인 선행 비트'라고 부른다. 이 방식을 사용하면 가수부에 할당된 비트를 최대한 효율적으로 활용하여 표현 가능한 유효숫자의 정밀도를 높일 수 있다. 예를 들어, 단정밀도 형식에서는 23비트의 가수 필드에 암묵적인 선행 1을 추가하여 총 24비트의 정밀도를 확보한다.
비정규화 수는 지수부가 최소값(모든 비트가 0)이고 가수부의 암묵적인 선행 비트가 0인 특별한 경우를 가리킨다. 이 표현은 0에 매우 가까운 아주 작은 수들을 표현하기 위해 고안되었다. 정규화 수는 지수의 최소값을 사용하더라도 절대값이 특정 최소 한계보다 큰 수만 표현할 수 있다. 비정규화 수는 이 한계보다 더 작은 수, 즉 정규화 표현으로는 불가능한 극히 미세한 크기의 수를 표현할 수 있도록 한다. 이를 통해 표현 가능한 수의 범위를 0 방향으로 확장하여 언더플로우가 발생하는 지점을 완화하는 효과가 있다.
그러나 비정규화 수의 사용에는 비용이 따른다. 비정규화 수는 정규화 수에 비해 상대적으로 정밀도가 낮아질 수 있다. 또한, 많은 프로세서에서 비정규화 수에 대한 산술 연산은 정규화 수에 대한 연산보다 훨씬 느리게 처리되거나, 일부 하드웨어에서는 완전히 지원되지 않을 수도 있다. 이는 성능에 민감한 과학 기술 계산이나 공학 시뮬레이션에서 중요한 고려 사항이 된다. 따라서 일부 환경에서는 비정규화 수의 처리를 완전히 비활성화하고, 그보다 작은 수는 0으로 취급하도록 설정하기도 한다.
정규화 수와 비정규화 수는 부동소수점 수 체계가 0 주변을 포함한 광범위한 수의 범위를 어떻게 표현하는지를 보여주는 중요한 개념이다. 이 두 형태는 함께 작동하여 표현 가능한 최대값과 최소값 사이의 간격을 메우며, 특히 0 근처의 수치적 해상도를 향상시키는 역할을 한다. 이러한 설계는 수치해석에서 반올림 오차와 언더플로우를 관리하는 데 기여한다.
3.4. 특수 값 (NaN, 무한대)
3.4. 특수 값 (NaN, 무한대)
IEEE 754 표준은 일반적인 숫자 표현 외에도 특별한 의미를 지닌 몇 가지 특수 값을 정의한다. 이는 연산 중 발생할 수 있는 예외적인 상황을 표현하고 프로그램의 비정상적 종료를 방지하기 위한 목적을 가진다.
가장 대표적인 특수 값은 NaN(Not a Number)이다. NaN은 숫자가 아닌 값을 의미하며, 0을 0으로 나누거나 음수의 제곱근을 계산하는 등 수학적으로 정의되지 않은 연산의 결과로 생성된다. NaN은 자신을 포함한 어떤 값과도 비교했을 때 같지 않다는 특징을 가지며, 이는 오류의 전파를 감지하는 데 활용된다. 다른 특수 값으로는 무한대가 있다. 무한대는 양의 무한대와 음의 무한대로 구분되며, 0이 아닌 수를 0으로 나누거나 표현 가능한 범위를 넘어서는 매우 큰 값이 발생했을 때 사용된다.
이러한 특수 값들은 수치해석이나 과학 기술 계산에서 중요한 역할을 한다. 예를 들어, 복잡한 공학 시뮬레이션이나 금융 모델링 과정에서 예상치 못한 연산 오류가 발생했을 때, 프로그램이 즉시 중단되는 대신 NaN이나 무한대 같은 값을 결과로 반환함으로써 이후의 오류 처리 로직이 실행될 수 있게 한다. 이는 시스템의 견고성을 높이는 데 기여한다.
따라서 부동소수점 연산을 다루는 프로그래밍 언어나 라이브러리는 이러한 특수 값의 생성 조건과 이를 확인하는 방법을 제공하며, 개발자는 이를 통해 보다 안정적인 컴퓨터 산술 프로그램을 작성할 수 있다.
4. 연산
4. 연산
4.1. 산술 연산
4.1. 산술 연산
부동소수점 산술 연산은 IEEE 754 표준에 정의된 규칙에 따라 수행된다. 기본적인 연산으로는 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근 계산 등이 있으며, 이러한 연산들은 하드웨어 수준의 부동소수점 연산 장치(FPU)나 소프트웨어 라이브러리를 통해 구현된다. 연산 과정은 일반적으로 정확한 수학적 결과를 구한 후, 이를 주어진 정밀도(예: 단정밀도 또는 배정밀도)에 맞게 반올림하는 방식으로 이루어진다.
연산 시 주의해야 할 주요 특징은 결합 법칙이 성립하지 않을 수 있다는 점이다. 예를 들어, (a + b) + c의 결과와 a + (b + c)의 결과가 반올림 오차로 인해 미세하게 다를 수 있다. 이는 큰 수와 작은 수를 더할 때 작은 수의 유효 숫자가 손실되는 유효숫자 문제와 관련이 있다. 또한, 매우 작은 수를 큰 수에 더하는 연산은 아무런 효과가 없을 수 있으며(흡수 현상), 두 수의 차이가 극단적으로 작을 때 발생하는 정밀도 손실도 중요한 문제이다.
연산 유형 | 주요 고려사항 및 문제점 |
|---|---|
덧셈/뺄셈 | 지수를 맞춘 후 가수를 연산하며, 정규화 과정 필요. 크기가 현저히 다른 수 간 연산 시 정밀도 손실 발생. |
곱셈 | 가수는 곱하고 지수는 더하며, 결과를 정규화. 오버플로우나 언더플로우 가능성. |
나눗셈 | 가수는 나누고 지수는 뺀 후 정규화. 0으로 나누기 시 무한대(Infinity) 발생. |
기타 연산 |
이러한 연산들은 수치해석의 기초를 이루며, 알고리즘을 설계할 때 반올림 오차의 누적과 전파를 고려해야 한다. 과학 계산이나 공학 시뮬레이션과 같이 높은 정확도가 요구되는 분야에서는 연산 순서를 신중하게 조정하거나, 배정밀도 연산을 사용하는 등의 주의가 필요하다.
4.2. 비교 연산
4.2. 비교 연산
부동소수점 숫자들 간의 비교 연산은 직관적이지 않을 수 있으며, 특히 정밀도와 반올림 오차로 인해 주의가 필요하다. 일반적으로 프로그래밍 언어에서 제공하는 == (같음) 또는 != (같지 않음) 연산자를 사용하여 두 부동소수점 값을 직접 비교하는 것은 권장되지 않는다. 계산 과정에서 발생할 수 있는 미세한 오차로 인해 이론적으로 동일해야 하는 두 값이 정확히 일치하지 않을 수 있기 때문이다.
이러한 문제를 해결하기 위해 널리 사용되는 방법은 두 값의 차이의 절대값을 구하고, 그 차이가 미리 정의한 매우 작은 허용 오차(엡실론) 범위 내에 있는지 확인하는 것이다. 예를 들어, 두 값 a와 b를 비교할 때 abs(a - b) < epsilon이 성립하면 두 값을 "실질적으로 같다"고 판단한다. 이때 epsilon의 값은 비교 대상 값의 규모와 요구되는 정확도에 따라 결정된다.
또한, IEEE 754 표준에서 정의한 NaN (Not a Number)과 같은 특수 값은 비교 시 특별한 규칙을 따른다. NaN은 어떤 값과도 비교했을 때, 심지어 자기 자신과 비교했을 때도 같지 않다고(!=) 판단된다. 따라서 값이 NaN인지 확인하려면 전용 함수(예: isnan())를 사용해야 한다. 마찬가지로 무한대 값(+Inf, -Inf) 간의 비교는 수학적 규칙을 따른다.
5. 주요 문제점
5. 주요 문제점
5.1. 정확도 문제
5.1. 정확도 문제
부동소수점 표현은 실수를 유한한 비트로 근사하기 때문에 본질적으로 정확도 문제를 수반한다. 가장 근본적인 문제는 십진법으로 표현되는 많은 수가 이진법 부동소수점으로 정확하게 표현될 수 없다는 점이다. 예를 들어, 십진수 0.1은 이진법으로는 무한 순환 소수가 되어, 컴퓨터 메모리에 저장될 때 반올림에 의해 근사값으로 저장된다. 이로 인해 누적된 반올림 오차는 수치해석 계산에서 예상치 못한 결과를 초래할 수 있다.
이러한 정확도 문제는 특히 반복적인 산술 연산이나 매우 큰 수와 매우 작은 수를 함께 다룰 때 두드러진다. 오버플로나 언더플로가 발생하지 않는 상황에서도, 가수 부분의 유효 비트 수에 의해 제한되는 유효숫자로 인해 계산 정밀도가 떨어진다. 행렬 연산이나 미분방정식 수치 해법처럼 많은 연산 단계를 거치는 과학기술 계산에서는 이 작은 오차가 증폭되어 최종 결과의 신뢰성을 크게 해칠 수 있다.
문제 유형 | 설명 | 일반적인 발생 예시 |
|---|---|---|
표현 오차 | 십진수를 정확히 이진법으로 표현 불가 |
|
소멸 | 비슷한 크기의 수를 뺄셈할 때 유효숫자 급감 | 두 근사값 간의 차분 계산 |
누적 오차 | 반올림 오차가 반복 연산으로 쌓임 | 수백만 번의 덧셈을 수행하는 시뮬레이션 |
정확도 문제를 완화하기 위한 방법으로는 계산 순서를 재배열하여 오차 누적을 최소화하거나, 문제에 맞게 단정밀도 대신 배정밀도를 사용하는 것이 있다. 또한, 높은 정확도가 요구되는 금융 계산 등 특정 분야에서는 십진 부동소수점 라이브러리를 사용하거나 고정소수점 연산을 대안으로 고려하기도 한다. 프로그래머는 사용하는 프로그래밍 언어와 하드웨어가 제공하는 부동소수점 연산의 특성을 이해하고, 중요한 비교 연산 시에는 완전한 동등 비교 대신 오차 허용 범위를 설정하는 것이 필수적이다.
5.2. 부동소수점 비교 오류
5.2. 부동소수점 비교 오류
부동소수점 비교 오류는 부동소수점 연산의 근본적인 특성인 반올림 오차 때문에 발생하는 일반적인 문제이다. 컴퓨터는 이진법을 사용하며, 메모리가 유한하기 때문에 모든 실수를 정확하게 표현할 수 없다. 이로 인해 수학적으로 동일해야 하는 계산 결과가 실제로는 미세하게 다른 값으로 저장될 수 있다. 예를 들어, 0.1 + 0.2의 연산 결과가 정확히 0.3이 되지 않는 현상이 대표적이다. 이러한 미세한 오차는 루프의 종료 조건이나 조건문에서 두 값을 직접 비교할 때 예상치 못한 오류를 일으킨다.
이 문제를 해결하기 위한 일반적인 방법은 두 값의 차이의 절대값이 미리 정의한 매우 작은 허용 오차(엡실론)보다 작은지를 확인하는 것이다. 이 기법을 엡실론 비교라고 한다. 즉, 두 값 a와 b가 '같다'고 판단하는 기준을 abs(a - b) < epsilon과 같은 형태로 정의한다. 이때 엡실론 값은 프로그램이 다루는 수의 크기와 요구되는 정밀도에 따라 적절히 선택해야 한다. 일부 프로그래밍 언어의 수학 라이브러리는 이러한 비교를 위한 함수를 제공하기도 한다.
또 다른 접근법은 상대 오차를 고려하는 것이다. 이는 두 값의 차이를 그 값들의 크기에 비례하여 비교하는 방법으로, 매우 큰 수나 매우 작은 수를 다룰 때 더욱 효과적일 수 있다. 또한, 특정 문제 영역에서는 값을 비교하기 전에 정규화하거나, 고정소수점과 같은 다른 데이터 타입을 사용하는 것이 더 적합할 수 있다. 금융 모델링처럼 십진법 계산의 정확성이 중요한 분야에서는 십진 부동소수점 라이브러리를 사용하기도 한다.
부동소수점 비교 오류는 버그를 찾기 어렵게 만들 수 있으므로, 소프트웨어 개발 초기 단계부터 인지하고 적절한 비교 기법을 적용하는 것이 중요하다. 특히 수치해석이나 과학 기술 계산을 수행하는 프로그램에서는 이 문제를 정확히 이해하지 못하면 계산 결과의 신뢰성을 보장할 수 없다.
6. 응용 및 대안
6. 응용 및 대안
6.1. 프로그래밍 언어에서의 처리
6.1. 프로그래밍 언어에서의 처리
대부분의 현대 프로그래밍 언어는 IEEE 754 표준을 따르는 부동소수점 연산을 기본적으로 지원한다. 언어의 자료형 시스템 내에서 float(단정밀도)와 double(배정밀도)과 같은 타입으로 제공되며, 이는 하드웨어의 FPU(부동소수점 연산 장치)의 지원을 받아 고속 연산이 가능하다. C 언어와 C++, 자바, C#, 파이썬 등 주요 언어들은 모두 이러한 타입을 포함하고 있다.
프로그래밍 시 주의해야 할 점은 언어마다 부동소수점 처리의 세부 사항이 다를 수 있다는 것이다. 예를 들어, 자바스크립트는 ECMAScript 표준에 따라 모든 숫자를 배정밀도 부동소수점 형식으로만 다루며 별도의 정수 타입이 없다. 반면, 파이썬의 float 타입은 배정밀도를 사용하며, 매우 큰 정수는 별도의 int 타입으로 무한 정밀도를 지원한다. 금융 계산처럼 정확한 십진법 연산이 필요한 경우, 일부 언어는 고정소수점 연산을 위한 전용 라이브러리나 Decimal 타입을 제공하기도 한다.
부동소수점의 반올림 오차와 정밀도 한계로 인해 프로그래밍 시 흔히 발생하는 문제는 비교 연산의 오류이다. 두 계산 결과가 이론적으로 같아야 함에도 미세한 오차로 인해 == 연산자가 false를 반환할 수 있다. 이를 해결하기 위해 두 값의 차이의 절대값이 아주 작은 엡실론 값보다 작은지를 검사하는 방법이 널리 사용된다. 또한, 누적 오차가 중요한 수치해석 알고리즘을 구현할 때는 연산 순서를 신중하게 설계해야 한다.
6.2. 고정소수점 및 기타 표현법
6.2. 고정소수점 및 기타 표현법
부동소수점은 실수를 표현하는 주된 방식이지만, 모든 응용 분야에 적합한 것은 아니다. 특히 고정소수점 표현법은 소수점의 위치가 미리 고정되어 있어, 제한된 범위 내에서 정밀한 계산이 필요한 경우에 유리하다. 디지털 신호 처리나 일부 임베디드 시스템, 그리고 과거의 일부 게임 콘솔에서 주로 사용되었다. 고정소수점은 하드웨어 구현이 간단하고 연산 속도가 빠르다는 장점이 있지만, 표현 가능한 수의 범위가 매우 좁다는 단점이 있다.
이러한 한계를 보완하기 위한 다른 대안 표현법도 존재한다. 유리수를 분자와 분모로 정확히 저장하는 방식은 덧셈이나 곱셈과 같은 기본 연산에서 반올림 오차가 전혀 발생하지 않는다는 장점이 있다. 그러나 연산 속도가 느리고, 표현 가능한 수의 크기에 제약이 따른다. 또 다른 접근법으로 BCD가 있는데, 이는 각 자릿수를 10진수로 직접 표현하여 금융 계산이나 회계 시스템에서 10진수 반올림 오차를 피하는 데 사용된다.
최근에는 머신 러닝과 인공지능 분야에서 계산 효율성을 높이기 위해 저정밀도 부동소수점이나 심지어 정수만을 사용하는 양자화 기법이 활발히 연구되고 적용된다. 또한, 매우 높은 정밀도가 요구되는 수학 및 과학 계산을 위해서는 임의 정밀도 연산 라이브러리를 사용하여 필요에 따라 정밀도를 확장하는 방법이 쓰인다. 이처럼 응용 분야의 요구사항에 따라 부동소수점 외에도 다양한 수 표현법과 연산 기법이 선택되어 사용된다.
