티스토리 뷰



컴퓨터 메모리에 2진 형태로 저장된 데이터를 문자를 비롯한 다양한 코드값으로 인식할 수도 있지만("코드와 데이터 표현 - 정보처리 필기 해설 7" 참조) 값 자체를 수치로 인식할 수도 있습니다. 이와같이 컴퓨터 메모리를 가지고 수치 데이터를 표현하는 방법에는 소수점 위치의 고정 여부에 따라 고정 소수점(Fixed point) 표현과 부동(浮動) 소수점 또는 유동(流動) 소수점(Floating point) 표현으로 나뉘고 고정 소수점 표현의 경우에는 2진 표현 방식과 10진 표현 방식으로 나뉩니다. 물론 표현에 사용하는 저장소의 크기에 따라 표현 가능한 수치의 범위도 달라집니다.


■ 고정 소수점(Fixed point) 표현

컴퓨터 내부에서 정수 표현에 사용하는 것으로 부동 소수점에 비해 연산 속도가 빠르고 정확성을 보장하는 장점이 있으나 수의 표현 범위가 제한적이라는 단점이 있습니다. C언어의 데이터타입을 예로 들어 설명하면 char, short, int, long, long long, signed, unsigned 등의 데이터 타입이 모두 고정 소수점 수치 표현에 사용되는 데이터 타입입니다. 

통상적으로 사용하는 2진 표현 방법은 MSB(Most Significant Bit, 최상위비트)를 부호비트로 사용할 것인지에 따라서 수치의 표현 범위가 달라지는데 부호 비트를 사용하는 2의 보수("정보의 단위와 진법 - 정보처리 필기 해설 6" 참조) 표현 방식을 사용하면 음수-0-양수를 표현하고 부호 비트를 사용하지 않고 그냥 값의 일부로 사용한다면 0과 양수만을 표현하게 됩니다.  바이트 크기별로 표현 가능한 수치 범위는 부호비트를 사용할 때와 사용하지 않을 때에 대해서 아래와 같습니다.

    • 1 바이트 : −128 ~ 127, 0 ~ 255

    • 2 바이트 : −32,768 ~ 32,767, 0 ~ 65,535

    • 4 바이트 : −2,147,483,648 ~ 2,147,483,647, 0 to 4,294,967,295

    • 8 바이트 : −9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807, 0 ~ 18,446,744,073,709,551,615

    • 16 바이트 : −170,141,183,460,469,231,731,687,303,715,884,105,728 ~ 170,141,183,460,469,231,731,687,303,715,884,105,727, 0 ~ 340,282,366,920,938,463,463,374,607,431,768,211,455


2진 표현 방법이 아닌 고정소수점 표현은 BCD(Binary-Coded Decimal)에 기반한 표현 방법으로 IBM 메인 프레임등에서 일부 사용하던 방식입니다. 1바이트에 EBCDIC 숫자 하나를 표현하는 Unpacked 방식과 1바이트에 숫자 두개를 표현하는 Packed 방식이 있습니다. 두가지 모두 Hex 'C'를 양수 Hex 'D'를 음수로 표현하여 맨 끝 바이트 또는 맨끝 니블(Nibble, 4bit)에 부호로 저장합니다.

12345 -> F1 F2 F3 F4 C5, -6789 -> F6 F7 F8 D9 (Unpacked)

12345 -> 12 34 5C, -6789 -> 06 78 9D (Packed)

EBCDIC("코드와 데이터 표현 - 정보처리 필기 해설 7" 참조) 코드에서 숫자는 존(Zone)부분이 2진수로 '1111'로 Hex F0~F9로 표현하는데 Unpacked 방식에서는 1바이트에 EBCDIC 각 숫자가 들어가고 맨 마지막 바이트만 존(Zone)부분을 Hex C나 D로 바꾸어 부호를 표현했습니다. Packed 방식에서는 BCD표현으로 각 수치를 배열하고 맨 끝 4비트에 부호를 나타내는  Hex C나 D를 입력했습니다. 

위와 같은 BCD 기반의 10진 수치 표현은 IBM 메인 플레임 뿐만아니라 인텔을 비롯한 다양한 프로세서에서 내부 연산 기능을 지원하고 있는데 2진 표현보다는 연산 속도가 떨어질 수 있지만 연산 결과를 문자로 표현하는 과정이 단순하다는 장점과 2진 표현 방식의 수치 제한을 넘어설 수 있다는 장점이 있습니다. 물론 ARM등 최근 프로세서들에서는 기능을 지원하지 않는 경우가 많습니다. 


■ 부동 소수점(Floating point) 표현

부동 또는 유동 소수점은  "소수점이 움직인다", "소수점이 흘러다닌다"는 의미입니다.

위의 예제는 모두 같은 값으로 지수부의 조정 다시 말하면 소수점의 이동을 통해서 아주 큰 범위의 수치를 표현할 수 있는 것입니다. 이러한 부동 소수점 표현은 IEEE 754라는 국제 표준을 통해서 일반화되었는데 가장 일반적으로 사용하는 4바이트 부동 소수점 표현은 MSB를 부호 비트로 사용하고 지수부(exponent) 8비트, 가수부(fraction, mantissa, significand, coefficient) 23비트로 구성됩니다. 수치를 보동소수점으로 표현하기 위해서 수치의 절대값을 2진수로 변환하고 이를 지수 형태로 변환하는 과정을 거치는데 이를 정규화(normalization)라고 합니다. 이 과정에서 가수부에 저장할 수 있는 값의 범위(유효숫자)안에 들지 못하는 경우에는 값이 잘려나가는 문제가 생기는데 이러한 문제점이 부동소수점이 표현할 수 있는 수치의 범위는 넓다는 장점이 있지만 정확도는 떨어지는 문제가 있는 것입니다. 아래는 IEEE 754에서 제시하고 있는 부동소수점 표현의 크기별 구성입니다.

    • 단정도(Single precision) : 총 4 Byte, 지수부 8 Bit, 가수부 23 Bit. 유효숫자 7자리

    • 배정도(Double precision) : 총 8 Byte, 지수부 11 Bit, 가수부 52 Bit. 유효숫자 15자리

    • 확장배정도(Extended double precision) : 총 10 Byte, 지수부 15 Bit, 가수부 64 Bit. 유효숫자 19자리

    • 4배정도(Quadruple precision) : 총 16 Byte, 지수부 15 Bit, 가수부 112 Bit. 유효숫자 34자리

    • 8배정도(Octuple precision) : 총 32 Byte, 지수부 19 Bit, 가수부 236 Bit. 유효숫자 71자리

위의 목록에서 유효숫자의 자리수는 십진수를 기준으로 한것입니다. 결과적으로 유효숫자를 넘어서는 값은 큰수이던 작은수이든 정확성을 잃게 된다는 의미입니다. IEEE 754 표준이 제정되던 시기는 부동소수점을 처리하는 FPU(Floating Point Unit)의 시초인 인텔의 80x86 Coprocessor가 등장하던 시기인데 부동소수점 연산을 하드웨어를 통해서 수행하려는 구상입니다. 최근의 프로세서들은 대부분 내부에 FPU를 내장하고 있고 고속의 부동소수점 연산이 필요한 그래픽 프로세서(GPU)의 경우에도 FPU를 내장하고 있는 추세입니다.

C언어에서 지원하는 부동소수점 데이터 타입은 float와 double을 들 수 있는데 부동 소수점을 특성을 감안해서 사용에 주의를 기울여야 합니다. 아래는 부동소수점 수를 사용하는 과정에서 주의해야할 몇가지 특성입니다.

    • 부동소수점 변수 간의 연산 과정에서 결합법칙 및 배분법칙이 맞지 않을 수 있습니다.
      ( a * b) * c = a * (b * c) 가 성립하지 않을 수도 있다는 의미이며
      a * (b + c) = (a * b) + (a * c) 또한 성립하지 않을 수 있다는 의미입니다.

    • 두 부동소수점에 대해서 값이 같은지 비교하는 것은 오류를 유발할 가능성이 있습니다. 이론적으로는 같은 값일지라도 실제는 차이가 있을 수 있기 때문에 "같은가?" 라고 비교하기 보다는 두 값의 차이가 일정범위 이내면 거의 같은 값이라 인식하는 것이 적절한 방법일 수 있습니다.

    • 부동소수점을 정수나 문자열로 변환하는 과정에서 일반적으로 예상한 결과를 얻지 못할 수 있습니다.

    • 앞서 언급한 것처럼 부동소수점 수가 표현할 수 있는 유효숫자의 범위가 있기 때문에 아주 큰수 또는 아주 작은 수를 다룰 때는 유효숫자 범위를 넘어서는 수치는 비정확성을 내포하고 있음을 감안해야 합니다.


※ 아래는 연관된 기출문제들 입니다. "정답보기"를 틀릭하면 답을 확인할 수 있습니다.

1. 부동 소수점(floating point)에 대한 설명으로 옳지 않은 것은?(정답보기)

    가. 두 수의 덧셈 및 뺄셈시 고정 소수점 표현 방식에서의 연산속도 보다 빠르다.

    나. 같은 비트로 수를 표시할 경우 고정 소수점 표현 방식 보다 더 큰 수를 나타낼 수 있다.

    다. 수의 표시에 있어서 정밀도를 높일 수 있어 과학, 공학. 수학적인 응용에 주로 사용된다.

    라. 소수점의 위치를 컴퓨터 내부에서 자동적으로 조절한다.


2. 고정 소수점(Fixed Point Number) 표현방식이 아닌 것은?(정답보기)

가. 1의 보수에 의한 표현

나. 2의 보수에 의한 표현

다. 9의 보수에 의한 표현

라. 부호와 절대값에 의한 표현


3. 다음에서 수치 자료에 대한 부동 소수점표현(Floating Point Representation)의 특징이 아닌 것은?(정답보기)

가. 고정소수점 표현보다 표현의 정밀도를 높일 수 있다.

나. 아주 작은 수와 아주 큰 수의 표현에는 부적합하다.

다. 수 표현에 필요한 자릿수에 있어서 효율적이다.

라. 과학이나 공학 또는 수학적인 응용에 주로 사용되는 수 표현이다.





댓글
댓글쓰기 폼