본문 바로가기
기초지식

고정소수점 연산: 임베디드 시스템에서 빠르고 정확한 연산 방법

by jaewoo93 2025. 4. 16.

고정소수점 연산이란?

고정소수점 연산(Fixed-Point Arithmetic)은 소수점의 위치가 고정된 상태에서 실수를 표현하고 계산하는 방식입니다. 이는 부동소수점 연산(Floating-Point Arithmetic)과 대조됩니다. 부동소수점은 소수점의 위치가 가변적이지만, 고정소수점은 소수점 이하의 자릿수가 고정된 구조로, 정수와 같은 방식으로 연산을 처리합니다.

고정소수점 방식은 주로 임베디드 시스템이나 DSP(디지털 신호 처리) 등 성능과 메모리 효율이 중요한 환경에서 자주 사용됩니다. 일반적으로 소수점의 위치를 고정하여 연산을 단순화하고 성능을 극대화할 수 있습니다.

고정소수점 연산의 장점

  1. 높은 성능 : 고정된 소수점 위치로 인해 계산이 단순화되어 하드웨어 연산 속도가 빨라집니다. 이는 임베디드 시스템에서 매우 중요한 요소입니다.
  2. 작은 메모리 사용량 : 부동소수점보다 적은 메모리 공간을 사용하므로, 메모리가 제한된 시스템에서 적합합니다.
  3. 정확성 : 부동소수점 연산에서 발생할 수 있는 미세한 오차가 고정소수점에서는 더 적게 발생합니다.

고정소수점 연산의 단점

  1. 정밀도 제한 : 소수점 아래 비트 수가 고정되어 있어 정밀도에 한계가 있습니다. 이는 매우 큰 수 또는 매우 작은 수를 표현하는 데 불리할 수 있습니다.
  2. 범위 제한 : 고정된 비트 수 안에서 표현할 수 있는 숫자의 범위가 작아, 부동소수점에 비해 표현할 수 있는 값의 폭이 좁습니다.
  3. 오버플로 및 언더플로 위험 : 고정 소수점 연산에서 오버플로(overflow) 및 언더플로(underflow)가 발생할 위험이 큽니다.

고정소수점 연산 예시 코드 (C언어)

다음은 C언어를 사용하여 고정소수점 연산을 구현한 예시 코드입니다. 16비트 고정 소수점 연산을 사용하여 덧셈, 곱셈, 나눗셈을 처리합니다.

#include <stdio.h>

#define FIXED_POINT_SHIFT 16 // 고정 소수점 자릿수 (16비트 소수점을 사용)
#define FIXED_POINT_SCALE (1 << FIXED_POINT_SHIFT) // 2^16 = 65536

// 정수를 고정 소수점으로 변환
int int_to_fixed(int x) {
return x * FIXED_POINT_SCALE;
}

// 고정 소수점을 정수로 변환
int fixed_to_int(int x) {
return x / FIXED_POINT_SCALE;
}

// 고정 소수점 곱셈
int fixed_mul(int a, int b) {
return (a * b) / FIXED_POINT_SCALE;
}

// 고정 소수점 덧셈
int fixed_add(int a, int b) {
return a + b;
}

// 고정 소수점 나눗셈
int fixed_div(int a, int b) {
return (a * FIXED_POINT_SCALE) / b;
}

int main() {
int a = int_to_fixed(3); // 3을 고정 소수점으로 변환
int b = int_to_fixed(2); // 2를 고정 소수점으로 변환

int result_add = fixed_add(a, b); // 고정 소수점 덧셈
int result_mul = fixed_mul(a, b); // 고정 소수점 곱셈
int result_div = fixed_div(a, b); // 고정 소수점 나눗셈

printf("3 + 2 = %d\n", fixed_to_int(result_add)); // 정수로 변환하여 출력
printf("3 * 2 = %d\n", fixed_to_int(result_mul)); // 정수로 변환하여 출력
printf("3 / 2 = %d\n", fixed_to_int(result_div)); // 정수로 변환하여 출력

return 0;
}

코드 설명

  • FIXED_POINT_SHIFT: 소수점 아래의 비트 수를 정의합니다. 여기서는 16비트(65536)를 사용합니다.
  • int_to_fixed: 정수를 고정소수점으로 변환하는 함수입니다.
  • fixed_to_int: 고정소수점을 다시 정수로 변환하는 함수입니다.
  • fixed_mul, fixed_add, fixed_div: 고정소수점 방식으로 각각 곱셈, 덧셈, 나눗셈을 처리하는 함수입니다.

출력 결과

위의 코드를 실행하면 다음과 같은 결과가 나옵니다:

  • 3 + 2 = 5
  • 3 * 2 = 6
  • 3 / 2 = 1

 

고정소수점 연산은 특히 성능과 메모리가 중요한 임베디드 시스템에서 효율적인 연산을 가능하게 합니다. 부동소수점에 비해 단순하고 빠르며, 메모리 사용량이 적다는 장점이 있지만 정밀도와 표현 범위에 제약이 있습니다. 고정소수점 연산은 임베디드 시스템의 특성에 따라 매우 유용할 수 있으며, 상황에 맞게 적절히 활용하는 것이 중요합니다.