> knowledge > [IEEE 754] floating-point(부동소수점)에 대하여

[IEEE 754] floating-point(부동소수점)에 대하여

IEEE 754는 IEEE에서 제정한 floating point(부동소수점)을 표현하는것에 대한 기술표준이다.
글을 쓰는 현재의 최신 version은 2008년 8월에 제정한 IEEE 754-2008이다.
이전에는 IEEE 754-1985는 binary floating point에 대한 표준을, IEEE 854-1987은 radix-independent floating point에 대한 표준(binary/decimal)을 정의했었지만 IEEE 754-2008에서는 이진법과 십진법을 모두 포함하고 있다.

IEEE 754 표준 정의

IEEE 754에서 정의하고 있는 주요 항목은 다음과 같다.

  • 산술 형식(Arithmetic formats)
  • 형식의 교환 (Interchange formats)
  • 반올림 규칙 (Rounding rules)
  • 연산 (Operations)
  • 예외 처리 (Exception handling)

이 외에도 고급 예외 처리, 추가 연산(삼각 함수 등) 등의 표준 또한 포함하고 있다.

Arithmetic formats

floating point(부동 소수점)은 실수를 표현할때 소수점의 위치를 나타내는 지수와 유효숫자를 표현하는 가수로 나누어 표현한다.
유한한 수외에도 무한대와 NaN에 대해서 표현할 수 있도록 표준을 제시하고 있다.

기본 형식

ArithmeticFormat

floating point에 대한 표현 방식은 위와 같다.

s : 부호부(sign)를 표현하며 0인 경우 +, 1인 경우 -를 나타낸다.
c : 가수부(significand, fraction, mantissa)를 나타내며 양의 정수로 표현된다. 정밀도(precision)에 따라 범위가 제한된다.
b : 밑수(base)/기수(radix)를 나타내며 IEEE 754에서는 2 또는 10이 된다. 이는 각각 2진수, 10진수 표현이 되는것을 의미한다.
q : 지수부(exponent)를 나타내며  지수부는 소수점의 위치를 나타내게 된다.

예를 들자면 1.2345를 밑수가 10인 경우로 표현을 한다면 다음과 같다.

decimalexam.png

기본 형식에 의해 각 부분의 값은 다음이 된다.

s : 0
c : 12345
b : 10
q : -4

실제 표현시에는 IEEE 754에서 정한 정밀도(precision)에 따라 가수부(significand)와 지수부(exponent)의 bit size가 달라지므로 표현하는 숫자의 자릿수가 달라지게 된다.

NaN (Not a number)

IEEE 754에서는 일반적인 수외에 특별한 값을 정의하고 있다.
NaN은 연산과정에서 잘못된 입력을 받아 계산을 하지 못했음을 나타내는 기호다.
NaN이 발생하는 주요 상황은 다음과 같다.

NaN.png

NaN을 표현하는 방식은 다음과 같다.

  • 지수부(exponent)의 모든 bit는 1로 채운다.
  • 가수부(significand)의 값은 0이 아니어야 한다.
  • 부호부(sign)은 의미를 두지 않는다.

두 가지 종류로 구분되며 quiet NaN과 signaling NaN이 있다.

Quiet NaN

Quiet NaN은 잘못된 입력으로 인해 예외를 발생시키지 않고 NaN을 반환하여 연산을 지속시키는 역할을 한다.
Quiet NaN의 경우 가수부의 모든 bit를 1로 채운다.

Signaling NaN

Signaling NaN은 quiet NaN과는 반대로 잘못된 연산시에 예외를 발생시키는 경우를 나타낸다.
Signaling NaN은 가수부의 대부분의 bit를 0으로 채우고 최소 1개의 bit를 1로 채운다.

무한대

무한대는 overflow가 발생하였을때 표현하는 값을 정의한다.
이는 표현 가능한 최대의 수를 무한대로 사용하는 것보다 안전한 방법이기 때문이다.
무한대를 표현하는 방식은 다음과 같다.

  • 지수부(exponent)의 모든 bit는 1로 채운다.
  • 가수부(significand)의 모든 bit는 0으로 채운다.
  • 부호부(sign)에 따라 양의 무한대와 음의 무한대로 구분된다.

예를 들어 0 / 0은 NaN이 된다.
하지만 0이 아닌 수를 0으로 나누게 되면 무한대가 발생하게 되는데 1 / 0 = ∞, -1 / 0 = -∞가 된다.
IEEE 754에서는 c 가 0이 아닐때 c / 0 = ±∞로 정의하고 있다.
이때 부호는 c의 부호를 따라가게 된다.
참고로 부호부의  bit가 0이면 양의 무한대, 1이면 음의 무한대가 된다.

Signed zero

IEEE 754에서는 부호가 있는 0을 구분하고 있다.
단 if (x == 0)과 같은 작업에서 불확실한 결과를 낼 수 있기 때문에 -0 = +0 이라는 규칙을 정해놓았다.
부호 있는 0을 사용하게 되면 1 / -∞ < 1 / +∞ 와 같은 표현이 가능하게 된다.
부호 있는 0을 표현하는 방식은 다음과 같다.

  • 지수부(exponent)의 모든 bit는 0으로 채운다.
  • 가수부(significand)의 모든 bit 역시 0으로 채운다.
  • 부호부(sign)에 따라 +0 과 -0으로 구분된다.

참고로 부호부의 bit가 0이면 +0, 1이면 -1이 된다.

Interchange formats

IEEE 754에서는 기본적으로는 32, 64, 128 bit의 binary 형식과 64, 128 bit의 decimal 형식을 정의하고 있다.
참고로 binary 32형식은 단정도(single precision), binary 64 형식은 배정도(double precision)라 한다. 각각의 형식에 대한 주요 인자들은 다음과 같다. (sign bit는 항상 1자리)

format.png

참고로 binary 형식의 경우 각 자릿수는 bit수와 동일하지만 decimal의 경우에는 표현하는 숫자의 자릿수를 나타내기때문에 실제 bit와는 차이가 있다. 또한 decimal 64decimal 128를 bit로 표현하는 방식이 약간 다르다.

이외에도 binary 16, binary 256, decimal 32를 정의하고 있다.
또한 기본 형식을 확장 하는 형식 역시 정의하고 있다. 확장 형식(extended precision format)은 표준 형식에서 얼마나 더 많은 bit를 추가해야 하는지에 대한 하한선만을 정하고 있다.
주요 확장 형식에는 x86 확장 배정도 등이 있다.

형식 변환(binary32)

임의의 실수를 IEEE 754표준인 binary32 (single precision, 단정도)로 표현을 하기 위해서는 실수의 절대값을 이진법(binary)로 변환한 후 부호부, 지수부, 가수부에 해당하는 값을 정리하여 정해진 위치에 표현하면 된다.
기본적으로는 다음의 단계를 거친다.

  • 먼저 임의의 실수에서 부호부를 bit로 표현한다. (0 은 +, 1은 -)
  • 절대값을 이진법으로 표현한다.
  • 정규화(normalize) 처리를 하여 산술표현 형식으로 만든다.
    ArithmeticFormat
  • 위의 결과에서 가수부(c)의 가장 앞의 1을 제외한 나머지를 가수부(significand) bit에 채운다.
    (이때 모자라는 부분은 0으로 채운다.)
  • 지수부(q)는 bias값을 더한 후 이진법으로 표현하여 지수부(sign) bit에 채운다.

좀 더 자세한 내용은 아래 표현 예시를 통해 확인해 본다.

표현 예시

임의의 실수 -12.375를 binary32 형식으로 표현해 본다.
binary32의 bit 구성은 위의 표에 의하면 가수부 23, 지수부 8, 부호부 1가 필요하므로 이를 도식으로  나타내면 다음과 같다.

binary32.png

먼저 임의의 실수에서 부호부를 bit로 표현하면 -12.375는 음수이므로 부호부(sign)의 bit 값은 1이 된다.

binary32_1.png

절대값 12.375를 이진법으로 표현하면 1100.011이 된다.
참고로 이진법으로 변환할 때 소숫점 앞의 정수부는 나머지가 2보다 작을때까지 나눈 나머지들로 표현을 하고 소숫점 뒤의 소수부는 결과가 1.0이 될때까지 2를 곱하여 각 단계별 정수부로 표현을 한다.

이제 결과를 정규화(normalize) 한다. 정규화란 산술표현시 가수부(c)의 맨 앞자리가 1이 되도록 처리하는 것을 뜻한다. 정규화가 되면 가수부(c)는 1.xxxx 식으로 표현된다.
앞의 결과를 정규화하면 다음과 같다.

binary32_2.png

정규화를 하게되면 가수부의 정수부는 항상 1이 되므로 binary32 표현시 생략한다.
binary32 형식은 가수부가 23 bit로 구성되어있지만 정규화 작업에 의해 가장 앞의 1은 생략하여 표현하므로 실제로는 24bit를 표현하고 있는 것이다. 이러한 방식을 숨겨진 bit(hidden bit)를 사용한다고 말한다.
이제 가수부를 표현하면 다음과 같다.

binary32_3.png

1.10011에서 가장 앞의 1을 제외한 소수부만 표현을 하면되고 남은 bit는 모두 0으로 채운다.

이제 지수부만 남았다. 지수부는 양수/음수 모두 가능하기 때문에 이를 표현하는 특별한 방법을 사용하는데 IEEE 754에서는 bias 표현을 사용하여 양수와 음수를 표현한다.
binary32 형식에서 지수부는 8 bit로 구성되어있고 최소값은 -126이고 최대값은 127을 갖는다.
8 bit로 표현가능한 값은 0 ~ 255이기때문에 이를 반으로 나누어 양수와 음수를 표현하는 것이다.

즉, bias + q = 지수부(exponent)가 된다.

본 예시에서는 q = 3이므로 bias + q = 127 + 3 = 130이 된다.
130을 이진법으로 표현하면 10000010이다. 이제 마지막으로 지수부를 채워 binary32로 표현하면 다음과 같다.

binary32_4.png

Denormalized (비정규화된 수)

IEEE 754에서는 NaN, 무한대 등과 같이 특별한 값이 하나 더 있다.
위의 표현 예시에서 보면 정규화를 통해 binary32를 표현하였는데 이때 가장 앞의 1을 제외하고 bit값을 채워넣어 표현하였다.
다시 말하면 정규화하여 표현된 모든 수는 숨겨진 bit로 인해 가수부가 항상 1.xx..xx 인 수를 표현 할 수 밖에 없다.
예를 들어 denormal_1.png 보다 작은 denormal_2.png의 경우 지수부의 표현범위를 벗어나므로 표현 할 수 가 없게된다.
또한 이렇게 아주 작은 값일 경우 일부 수식에서 오류가 발생할 수도 있다.
그래서 IEEE 754에서는 비정규화된 수(Denormalized numbers)를 도입하여 이를 해결하고 있다.
비정규화된 수를 사용한 동작을 점진적 언더플로우(gradual underflow)라고 부른다.
비정규화된 수를 표현하는 방식은 다음과 같다.

  • 지수부(exponent)의 모든 bit는 0으로 채운다.
  • 부호부(sign)와 가수부(significand)의 값을 표현한다.

Rounding rules

IEEE 754에서는 floating-point 연산(혹은 변환)시 가수부(significand) 표현 범위를 넘어가는 경우 보다 원본값과 가장 가까운 값의 표현을 위해 반올림을 처리하게 된다.
IEEE 754에서는 다음의 다섯가지 종류의 반올림 방식을 정의하고 있다.

round up

round up은 반올림 처리시 +∞ 방향으로 올림처리를 한다.
그렇기때문에 음수인 경우에는 0의 방향으로 향하기때문에 절대값을 기준으로 본다면 숫자가 버림처리가 된다.

roundup

round down

round down은 반올림 처리시 -∞ 방향으로 내림처리를 한다.
그렇기 때문에 음수인 경우에는 절대값 기준으로 본다면 숫자가 올림처리가 된다.

rounddown.png

round toward zero

round toward zero는 반올림 처리시 항상 0의 방향으로 가장 가까운 숫자를 선택한다.
절대값을 기준으로 본다면 원래의 값보다 절대값이 작거나 같은 값 중에 가장 큰 숫자를 선택하게 된다. 즉 항상 버림처리가 된다.

roundzero

round to nearest, ties to even

round to nearest는 말 그대로 가장 가까운 값으로 반올림을 하는 것인데 IEEE 754에서는 가장 가까운 값의 기준으로 두 가지로 분류했다.
하나는 ties to even으로 가장 가까운 값이 2개인 경우( 예를 들어 0.5인 경우 가장 가까운 값은 0과 1) 가수부의 마지막 자리가 짝수인 값을 선택하는 것이다.
round to nearest, ties to even은 banker’s rounding이라고도 부르며 IEEE 754 표준에서는 rounding 처리에 대한 기본 방식으로 제시하고 있다.

roundeven.png

round to nearest, ties to even은 가장 가까운 값이 2개인 경우 짝수(even)을 향하게 되므로 화살표의 방향성은 다음과 같이 달라질 수도 있다.

roundeven2.png

round to nearest, ties away from zero

또하나의 방식으로는 ties away from zero가 있습니다. 이는 가장 가까운 값이 2개인 경우 절대값 기준으로 가장 큰값을 선택한다.

roundtieawayzero.png

Operations

IEEE 754에서는 floating point(부동 소수점) 표현외에도 산술 연산, 변환, 테스트 등에 관련된 표준을 정의하고 있다.
산술 연산의 경우 연산이 먼저 계산된 후 반올림(round to nearest, ties to even) 처리를 하도록 되어있다. 또한 거듭제곱, 나머지, 부호 처리 등에 대한 기준도 제시하고 있다.
왜냐하면 표준에 따르는 프로그램들 사이에서는 항상 동일한 결과를 얻을 수 있게 보장하는 것과 이식성(portability)을 높이기 위함이다.

Exception handling

IEEE 754에서는 각종 상황에 따라 예외가 발생하는 경우 이를 처리하는 handler를 사용하는 것을 정하고 있다. 기본적으로는 5개의 예외 상황을 정하고 있다.

  • Invalid operation (잘못된 연산)
    연산시에 잘못된 인자가 사용되는 경우에 발생하며 기본적으로는 NaN을 반환한다.
  • Division by zero (0으로 나누기)
    피 연산자가 0인 경우에 발생하며 기본적으로는 ±∞를 반환한다.
  • Overflow
    반올림 처리 후 표현범위를 벗어날때 발생하며 기본적으로는 ±∞를 반환한다.
  • Underflow
    반올림 처리 후 표현범위보다 너무 작은 값이 될때 발생하며 기본적으로는 비정규화된 수를 반환한다. 보통 inexact(부정확함)과 같이 발생된다.
  • Inexact (부정확함)
    연산의 결과가 부정확할 때 발생한다. 부정확하다는 것은 반올림 처리시 0이 아닌 수가 잘리는 상황이 발생할때가 대부분이다. 기본적으로는 반올림 처리된 결과를 반환한다.

또한 각각의 예외 상황을 정확하게 판단하기 위해 각각 1개의 상태 flag를 할당하여 예외 처리를 진행한다.

이 외에도 decimal floating point를 위해 clamped(exponent에 표현할 값이 범위를 벗어나는 경우 발생)와 Rounded(반올림시 숫자가 잘릴때, 만약 Rounded가 발생했는데 0이 아닌 수가 잘렸다면 Inexact가 발생된다.)를 추가로 정의하고 있다.

참고 자료

IEEE floating-point, wiki

IEEE 754, wiki (한국어)

What every computer scientist should know about floating-point arithmetic (english)

What every computer scientist should know about floating-point arithmetic (번역본)

NUM04-J Do not use floating-point numbers if precise computation is required

Programming in Java – 9.1 Floating point

IEEE 754 요약정보, 메아리 풉;

Floating Point Rounding

Rounding Algorithms

NaN, wiki

decimal64 floating-point format

decimal128 floating-point format

카테고리:knowledge
  1. 송승걸
    3월 20, 2017 3:49 pm

    좋아요

  2. 박재석
    3월 30, 2018 11:42 am

    좋은 글 잘 읽었습니다. 읽던 도중에 의문점이 생겨서 댓글 남기고 갑니다.

    이제 지수부만 남았다. 지수부는 양수/음수 모두 가능하기 때문에 이를 표현하는 특별한 방법을 사용하는데 IEEE 754에서는 bias 표현을 사용하여 양수와 음수를 표현한다.
    binary32 형식에서 지수부는 8 bit로 구성되어있고 최소값은 -126이고 최대값은 127을 갖는다.

    여기서 최소값은 -128 아닌가요?

    • 3월 30, 2018 6:21 pm

      먼저 글을 읽어주셔서 감사합니다.

      지수부의 경우 예약된 숫자가 있습니다. 지수부가 모두 0인 경우(-127에 해당)와 모두 1인 경우(128에 해당)은 NaN, 무한대, 비정규화된 수(Denormalized) 등을 표현할때 사용됩니다.
      그래서 binary32형식에서 지수부의 최소값은 -126이 됩니다.

  3. 8월 21, 2018 7:11 pm

    좋은 글 잘 읽었습니다. 감사합니다.

  4. 11월 8, 2019 6:33 pm

    감사합니다 너무 설명이 잘되어있네요..(감사해서 광고 3번누르고 갑니다)ㅎㅎ! 좋은하루되세요

  5. hyemin
    12월 6, 2021 11:11 am

    감사합니다 감사합니다.. 압도적으로 감사합니다…

  6. soso
    11월 4, 2022 7:52 pm

    좋은 글 정말 감사합니다!

  1. 6월 30, 2016 5:03 pm

댓글 남기기