IEEE 754
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
IEEE 754는 부동소수점 숫자를 표현하고 처리하기 위한 국제 표준으로, 1985년에 처음 발표되었으며 여러 차례 개정을 거쳐 현재는 IEEE 754-2019가 최신 버전이다. 이 표준은 이진 부동소수점 형식뿐만 아니라 십진 부동소수점 형식도 정의하며, 32비트, 64비트, 128비트 이진 형식과 64비트, 128비트 십진 형식을 포함한 다양한 형식을 제공한다. IEEE 754는 부호, 지수, 가수로 구성된 부동소수점 표현 방식을 사용하며, 덧셈, 뺄셈, 곱셈과 같은 산술 연산, 형식 간 변환, 비교 연산 등 다양한 연산을 정의한다. 또한, 반올림 규칙, 예외 처리, 특수 값(무한대, NaN, 부호 있는 영)에 대한 정의를 포함하며, 십진수와 이진수 간의 정확한 변환을 위한 알고리즘도 제공한다.
더 읽어볼만한 페이지
- 부동소수점 - IEEE 754-1985
IEEE 754-1985는 부동소수점 수의 표현, 연산, 반올림 등을 정의하는 기술 표준으로, 부호 비트, 지수, 가수를 사용하여 숫자를 표현하며, 단정밀도, 배정밀도, 확장 정밀도 형식을 제공하고, 0, 무한대, NaN과 같은 특수한 값을 정의하며, 표준 연산과 다양한 함수 및 술어를 제공한다. - 부동소수점 - 플롭스
플롭스(FLOPS)는 컴퓨터의 부동 소수점 연산 속도를 나타내는 단위이며, 슈퍼컴퓨터의 성능을 평가하는 지표로 사용된다. - 컴퓨터 산술 - 1의 보수
1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다. - 컴퓨터 산술 - 삼진법
삼진법은 0, 1, 2 세 가지 숫자를 사용하여 수를 표현하는 위치 기수법으로, 3의 배수 계산에 유리하며, 다양한 분야에서 활용되고 음수를 포함하는 변형된 형태도 존재한다. - IEEE 표준 - IEEE 802.2
IEEE 802.2는 데이터 링크 계층의 LLC 서브레이어를 정의하는 IEEE 802 표준의 일부로, 비연결 및 연결 지향 모드를 지원하며, LLC 클래스 I, II, III, IV를 통해 다양한 서비스 유형을 제공하고, DSAP, SSAP 주소 및 제어 필드로 구성된 헤더와 필요에 따라 SNAP 확장을 사용해 네트워크 통신을 관리한다. - IEEE 표준 - POSIX
POSIX는 유닉스 기반의 이식 가능한 운영체제 인터페이스를 표준화하기 위한 IEEE 표준군으로, 프로세스 관리, 파일 시스템 접근, 스레드 처리 등 핵심 서비스들을 규정하며 운영체제 간 호환성을 높이는 데 기여한다.
IEEE 754 | |
---|---|
IEEE 754 표준 | |
기술 정보 | |
표준 명칭 | IEEE 754 |
발행 기관 | IEEE (전기 전자 기술자 협회) |
최초 발행일 | 1985년 |
최신 개정판 | 2019년 |
분야 | 부동소수점 산술 |
정의 | 부동소수점 숫자 형식 산술 연산 예외 처리 변환 |
응용 분야 | 컴퓨터 프로세서 데이터베이스 그래픽 과학 컴퓨팅 |
부동소수점 형식 | |
기본 형식 | 단정밀도 (32비트) 배정밀도 (64비트) |
확장 형식 | 80비트 확장 단정밀도 128비트 4배정밀도 |
추가 형식 | 16비트 반정밀도 다양한 확장 정밀도 형식 |
산술 연산 | |
연산 종류 | 사칙연산 (덧셈, 뺄셈, 곱셈, 나눗셈) 제곱근 나머지 반올림 비교 |
연산 특징 | 무한대 처리 NaN (Not a Number) 처리 부호 있는 0 예외 처리 |
예외 처리 | |
예외 종류 | 무효 연산 0으로 나눔 오버플로 언더플로 부정확한 결과 |
처리 방법 | 기본 처리 (NaN 또는 무한대 반환) 사용자 정의 예외 처리 |
기타 | |
관련 표준 | ISO/IEC 60559 |
관련 자료 | IEEE 754-2019 표준 DECIMAL FLOATING POINT: 알고리즘 |
2. 역사
1960년대와 1970년대, 비즈니스 및 과학 컴퓨팅 업계는 부동소수점 표현 방식의 혼란을 겪었다. IBM은 16진수 부동소수점 형식을 사용했고, CDC와 크레이 컴퓨터는 일의 보수 표현 방식을 사용했는데, 이는 +0과 -0의 값을 허용했다. 0으로 나누기 예외 처리 또한 컴퓨터마다 달랐다. 시스템 간에 데이터를 이동하거나, 심지어 서로 다른 시스템에서 동일한 계산을 반복하는 것조차 어려운 경우가 많았다.
IEEE 754 부동소수점 표현은 크게 부호, 지수, 가수의 세 부분으로 구성된다. 최상위 비트는 부호를 나타내며, 양수 또는 음수를 표현한다. 지수 부분(exponent)은 숫자의 크기를 나타내는 지수를 저장한다. 가수 부분(fraction/mantissa)은 숫자의 유효숫자를 나타낸다.[78]
부동소수점 연산에 대한 최초의 IEEE 표준인 IEEE 754-1985는 1985년에 발표되었다. 이 표준은 이진 부동소수점 연산만을 다루었다.
7년간의 개정 과정을 거쳐 댄 주라스(Dan Zuras)가 의장을 맡고 마이크 카울리쇼(Mike Cowlishaw)가 편집을 맡은 새로운 버전인 IEEE 754-2008이 2008년 8월에 발표되었다. 이 표준은 IEEE 754-1985(이진 부동소수점 연산)와 IEEE 854-1987 기수 독립 부동소수점 연산 표준을 모두 대체했다. 원래 표준의 이진 형식은 이 새로운 표준에 포함되어 있으며, 이진 형식 하나와 10진수 형식 두 개의 세 가지 새로운 기본 형식이 추가되었다. 현재 표준을 준수하려면 구현은 적어도 하나의 기본 형식을 산술 형식과 교환 형식 모두로 구현해야 한다.
IEEE 754-2008과 내용이 동일한 국제 표준 '''ISO/IEC/IEEE 60559:2011'''은 ISO/IEC JTC 1/SC 25의 ISO/IEEE PSDO 협정[2][3]에 따라 채택이 승인되었고 발표되었다.
2015년 9월에 시작된 개정 과정을 데이비드 G. 휴(David G. Hough)가 의장을 맡고 마이크 카울리쇼(Mike Cowlishaw)가 편집을 맡아 2019년 7월에 발표된 최신 버전인 IEEE 754-2019는 IEEE 754-2008을 기반으로 하며 이를 대체한다. 이 버전에는 주로 명확성 (예: ''totalOrder'') 및 결함 수정 (예: ''minNum'')이 포함되어 있지만, 일부 새로운 권장 연산 (예: ''augmentedAddition'')도 포함되어 있다.[4][5]
IEEE 754-2019와 내용이 동일한 국제 표준 '''ISO/IEC 60559:2020'''은 ISO/IEC JTC 1/SC 25를 통해 채택이 승인되었고 발표되었다.
표준의 다음 개정판은 2029년에 예상된다.[6]
3. 구조
일부 숫자는 여러 가지 부동 소수점 표현이 가능하다. 예를 들어 ''b'' = 10이고 ''p'' = 7이면 −12.345는 −12345×10−3, −123450×10−4, −1234500×10−5로 표현될 수 있다. 그러나 대부분의 연산에서 결과는 입력의 표현 방식에 의존하지 않는다.
이진수 형식의 경우, 값을 정확하게 표현할 수 있는 가장 작은 지수를 선택하여 표현 방식을 고유하게 만든다. 지수는 바이어스가 추가되어 가장 작은 표현 가능한 지수가 1로 표현되며, 비정규화수에는 0이 사용된다. 정규 범위의 지수를 가진 숫자의 경우, 유효숫자의 최상위 비트는 항상 1이므로 암시적으로 표현될 수 있다. 이 규칙을 통해 이진수 형식은 정밀도를 한 비트 더 높일 수 있다.
NaN은 다른 정보를 포함할 수 있는데, 부호 비트와 NaN의 원인을 나타내는 진단 정보를 위한 ''페이로드''가 있다.[8][9][10]
IEEE 754 표준에서는 기수와 사용하는 비트 수에 따라 5가지 기본 형식을 정의한다. 32/64/128비트로 표현하는 3가지 이진 부동소수점 형식과 64/128비트로 표현하는 2가지 십진 부동소수점 형식으로 구성된다. 이진 형식의 처음 두 가지는 IEEE 754-1985에서 단정도(single) 및 배정도(double)로 불리는 형식이다.형식명 일반명 기수
(b)자릿수·비트 수
(p)지수 최솟값
(emin)지수 최댓값
(emax)비고 십진 환산
자릿수십진 환산
emaxbinary16 반정도 2 10+1 −14 +15 교환 형식이며, 기본 형식이 아님 3.31 4.51 binary32 단정도 2 23+1 −126 +127 7.22 38.23 binary64 배정도 2 52+1 −1022 +1023 15.95 307.95 binary128 사정도 2 112+1 −16382 +16383 34.02 4931.77 decimal32 십진 단정도 10 7 −95 +96 교환 형식이며, 기본 형식이 아님 7 96 decimal64 십진 배정도 10 16 −383 +384 16 384 decimal128 십진 사정도 10 34 −6143 +6144 34 6144
단정밀도 이진 부동소수점수는 32비트 단어에 저장된다.
sign은 부호, exponent는 지수부, fraction은 가수부이다. 지수부는 실제 값에 127을 더한 바이어스 값으로 표현된다. 단정밀도에서는 −126 ~ +127에 127을 더하여 1 ~ 254로 표현한다 (0과 255는 특수한 의미를 가짐).
표현 가능한 데이터는 지수부의 값에 따라 구별되며, 가수부의 값에도 영향을 받는다.종류 exponent(지수부) fraction(가수부) 영 0 0 비정규화수 0 0 이외 정규화수 1 – 254 임의 무한대 255 0 NaN 255 0 이외의 임의
3. 1. 예시 (32비트 단정밀도)
이 결과를 정리해서 표시하면 다음과 같다.[78]
4. 형식
IEEE 754 부동소수점 표기 표준은 유한한 수, 무한대, NaN(Not a Number) 값을 포함하는 2진수 및 10진수 부동소수점 데이터 집합인 산술 형식과 부동소수점 데이터를 효율적으로 교환하기 위한 인코딩 방식 등을 정의한다.[7]
부동소수점 형식은 기수(''b'', 2 또는 10), 정밀도(''p''), 지수 범위(''emin''부터 ''emax''까지, ''emin'' = 1 - ''emax'')로 지정된다.
형식은 다음으로 구성된다.
- 유한수(Finite numbers): 부호 ''s''(0 또는 1), 유효숫자 ''c''(''p''자리 이하), 지수 ''q''(''emin'' ≤ ''q'' + ''p'' − 1 ≤ ''emax'')로 표현되며, (−1)''s'' × ''c'' × ''b''''q'' 값을 가진다. 부호 비트에 따라 +0(양의 영)과 −0(음의 영) 두 가지 영 값이 존재한다.
- 무한대(Infinity): +∞와 −∞ 두 가지 값이 있다.
- NaN(Not a Number): 조용한 NaN(qNaN)과 신호 NaN(sNaN) 두 종류가 있다.
표준은 기본 형식 외에 더 높은 정밀도를 제공하는 확장 및 확장 가능 정밀도 형식을 정의한다.[12] 확장 정밀도 형식은 더 높은 정밀도와 더 넓은 지수 범위를 가지며, 확장 가능 정밀도 형식은 사용자가 정밀도와 지수 범위를 지정할 수 있다.
4. 1. 기본 형식
IEEE 754 표준에는 기수(2 또는 10)와 비트 수에 따라 이름이 붙여진 5가지 기본 형식이 정의되어 있다.[11] 3가지 이진 부동소수점 기본 형식(32/64/128비트로 표현)과 2가지 십진 부동소수점 기본 형식(64/128비트로 표현)으로 구성된다.[78] 이 중 이진 형식의 처음 두 가지는 IEEE 754-1985에서 각각 단정도(single) 및 배정도(double)로 불렸으며, 세 번째 이진 형식은 사정도(quad)라고도 불린다. 십진 형식의 두 가지도 배정도 및 사정도라고 불린다.기본 이진 형식은 가수부에 실제로 유지되는 비트 수보다 1비트 더 높은 정밀도를 가진다. 이는 이진 형식의 정규화된 부동소수점수에서 최상위 비트(자릿수)가 항상 1임을 이용하여 부호화 시에 이를 생략하여 표현하기 때문이다(케치 표현).
형식명 | 일반명 | 기수 (b) | 자릿수·비트 수 (p) | 지수 최솟값 (emin) | 지수 최댓값 (emax) | 비고 | 십진 환산 자릿수 | 십진 환산 emax |
---|---|---|---|---|---|---|---|---|
binary16 | 반정도 | 2 | 10+1 | −14 | +15 | 교환 형식이며, 기본 형식이 아님 | 3.31 | 4.51 |
binary32 | 단정도 | 2 | 23+1 | −126 | +127 | 7.22 | 38.23 | |
binary64 | 배정도 | 2 | 52+1 | −1022 | +1023 | 15.95 | 307.95 | |
binary128 | 사정도 | 2 | 112+1 | −16382 | +16383 | 34.02 | 4931.77 | |
decimal32 | 십진 단정도 | 10 | 7 | −95 | +96 | 교환 형식이며, 기본 형식이 아님 | 7 | 96 |
decimal64 | 십진 배정도 | 10 | 16 | −383 | +384 | 16 | 384 | |
decimal128 | 십진 사정도 | 10 | 34 | −6143 | +6144 | 34 | 6144 |
십진 환산 자릿수는 ''p'' × log10 ''b''로 얻어지는 십진 자릿수의 근사값이다.
십진 환산 emax는 ''emax'' × log10 ''b''로 얻어지는 십진 지수 최댓값이다.
4. 2. 확장 및 확장 가능 정밀도 형식
표준에서는 기본 형식보다 정밀도를 높이기 위해 확장 정밀도 형식을 정의한다.[12] 확장 정밀도 형식은 기본 형식보다 더 높은 정밀도와 더 넓은 지수 범위를 사용한다. 확장 가능 정밀도 형식을 사용하면 사용자가 정밀도와 지수 범위를 지정할 수 있다. 구현 시에는 이러한 형식에 대해 선택한 내부 표현을 사용할 수 있지만, 매개변수(b, p, emax)는 정의해야 한다. 이러한 매개변수는 표현 가능한 유한 수 집합을 고유하게 설명한다.표준에서는 언어 표준이 지원되는 각 기수 b에 대해 p와 emax를 지정하는 방법을 제공할 것을 권장한다.[13] 또한, 언어 표준과 구현은 각 기수 b에 대해 지원되는 가장 큰 기본 형식보다 더 높은 정밀도를 갖는 확장 형식을 지원할 것을 권장한다.[14] 두 기본 형식 사이의 정밀도를 갖는 확장 형식의 경우, 지수 범위는 더 넓은 기본 형식의 지수 범위와 같아야 한다. 예를 들어, 64비트 확장 정밀도 이진수는 최소 16383의 'emax'를 가져야 한다. x87 80비트 확장 형식은 이 요구 사항을 충족한다.
원래 IEEE 754-1985 표준에는 emin과 emax 사이의 필수 관계 없이 '확장 형식'이라는 개념도 있었다. 예를 들어, emin = −emax인 모토롤라 68881 80비트 형식[15]은 준수하는 확장 형식이었지만, 2008년 개정판에서는 준수하지 않게 되었다.
4. 3. 교환 형식
IEEE 754 표준에서는 부동소수점 데이터를 교환하기 위한 교환 형식을 정의하고 있다. 교환 형식은 주어진 형식에 대해 고정 길이의 비트 문자열을 사용하여 부동소수점 데이터를 교환하기 위한 것이다.교환 형식에는 이진 교환 형식과 십진 교환 형식이 있다.
이진 부동소수점 수의 교환을 위해 16비트, 32비트, 64비트 및 128비트 이상의 32비트 배수 길이의 교환 형식이 정의된다. 16비트 형식은 작은 수(예: 그래픽용)의 교환 또는 저장을 위한 것이다.
이러한 이진 교환 형식의 인코딩 방식은 IEEE 754-1985와 동일하다. 부호 비트, 그 뒤에 지수를 바이어스만큼 보정한 값을 나타내는 ''w''개의 지수 비트, 그리고 가수를 나타내는 ''p'' − 1비트로 구성된다. ''k''비트 형식의 지수 필드 너비는 ''w'' = round(4 log2(''k'')) − 13으로 계산된다. 기존의 64비트 및 128비트 형식은 이 규칙을 따르지만, 16비트 및 32비트 형식은 이 공식에서 제공하는 것보다 더 많은 지수 비트(각각 5비트와 8비트)를 갖는다(각각 3비트와 7비트).
십진 부동소수점 수의 교환을 위해 32비트 배수인 다양한 교환 형식이 정의된다. 이진 교환과 마찬가지로 십진 교환 형식의 인코딩 방식은 부호, 지수 및 가수를 인코딩한다. 두 가지 다른 비트 수준 인코딩이 정의되며, 사용 중인 인코딩의 외부 표시기가 필요할 수 있다는 점 때문에 교환이 복잡해진다.
두 가지 옵션을 통해 가수를 밀집 십진수를 사용하여 압축된 십진수열로 인코딩하거나, 또는 이진 정수로 인코딩할 수 있다. 전자는 표준의 직접적인 하드웨어 구현에 더 편리한 반면, 후자는 이진 컴퓨터에서 소프트웨어 에뮬레이션에 더 적합하다. 어느 경우든, 인코딩할 수 있는 수 집합(부호, 가수 및 지수의 조합)은 동일하며, 특수값(최소 지수를 가진 ±영, ±무한대, 정적 NaN 및 신호 NaN)은 동일한 인코딩을 갖는다.
5. 반올림 규칙
IEEE 754 표준은 다섯 가지 반올림 규칙을 정의한다. 처음 두 규칙은 가장 가까운 값으로 반올림하고, 나머지는 절삭 반올림이라고 한다.[16]
하위 섹션에서 '''가까운 값으로 반올림'''과 '''방향 반올림'''에 대한 자세한 설명을 제공한다.
5. 1. 가까운 값으로 반올림
IEEE 754 표준에서는 다섯 가지 반올림 규칙을 정의한다. 처음 두 규칙은 가장 가까운 값으로 반올림하고, 나머지는 '''절삭 반올림'''이라고 한다.[16]- '''가까운 값으로 반올림(짝수로 반올림)''' – 가장 가까운 값으로 반올림한다. 숫자가 중간에 있는 경우, 최하위 자릿수가 짝수인 가장 가까운 값으로 반올림한다. 이진 부동 소수점의 기본값이며 십진수의 권장 기본값이다.[17]
- '''가까운 값으로 반올림(0에서 먼 쪽으로 반올림)''' – 가장 가까운 값으로 반올림한다. 숫자가 중간에 있는 경우, 양수이면 위쪽, 음수이면 아래쪽의 가장 가까운 값으로 반올림한다. 십진수 구현에만 필요하다.[17]
5. 2. 방향 반올림
; 0으로 반올림: 0에 가까운 쪽으로 반올림한다. 버림(truncation)이라고도 한다.[18]
; +∞으로 반올림
: 양의 무한대에 가까운 쪽으로 반올림한다. 올림(rounding up, ceiling)이라고도 한다.[18]
; −∞으로 반올림
: 음의 무한대에 가까운 쪽으로 반올림한다. 내림(rounding down, floor)이라고도 한다.[18]
모드 | 예시 값 | |||
---|---|---|---|---|
+11.5 | +12.5 | −11.5 | −12.5 | |
가장 가까운 수로 반올림, 동일한 경우 짝수로 반올림 | +12.0 | +12.0 | −12.0 | −12.0 |
가장 가까운 수로 반올림, 동일한 경우 0에서 먼 쪽으로 반올림 | +12.0 | +13.0 | −12.0 | −13.0 |
0으로 반올림 | +11.0 | +12.0 | −11.0 | −12.0 |
+∞으로 반올림 | +12.0 | +13.0 | −11.0 | −12.0 |
−∞으로 반올림 | +11.0 | +12.0 | −12.0 | −13.0 |
6. 연산
IEEE 754 표준은 부동소수점 수의 연산에 대한 다양한 규정을 정의한다. 여기에는 산술 연산, 변환, 반올림 규칙, 예외 처리 등이 포함된다.[19][20]
표준에 포함된 연산은 다음과 같다.
종류 | 내용 |
---|---|
산술 연산 | 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근, 융합 곱셈-덧셈(FMA), 나머지, 최솟값, 최댓값 |
변환 | 형식 간 변환, 문자열과의 변환 |
스케일링 및 양자화 | 10진수의 경우 스케일링 및 양자화 |
부호 | 부호 복사 및 조작 (절댓값, 부호 반전 등) |
비교 | 비교 및 전체 순서 |
분류 | 숫자 분류 (비정규, 유한 등) 및 NaN 검사 |
플래그 | 상태 플래그 검사 및 설정 |
표준에서는 지원되는 산술 형식의 부동 소수점 데이터를 서로 비교하기 위한 비교술어를 제공한다.[30] NaN과의 비교는 비순서로 처리되며, -0과 +0은 같다고 비교된다.
표준에서는 지원되는 산술 형식의 표준 멤버에 대한 전순서를 정의하는 ''totalOrder'' 술어를 제공한다.[31]
6. 1. 필수 연산
IEEE 754 표준은 다음과 같은 필수 연산을 정의한다.- 산술 연산: 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근, 융합 곱셈-덧셈(FMA), 나머지, 최솟값, 최댓값[19][20]
- 변환: 형식 간 변환, 문자열과의 변환[21][22]
- 스케일링 및 양자화: 10진수의 경우 스케일링 및 양자화[23][24]
- 부호: 부호 복사 및 조작 (절댓값, 부호 반전 등)[25]
- 비교: 비교 및 전체 순서[26][27]
- 분류: 숫자 분류 (비정규, 유한 등) 및 NaN 검사[28]
- 플래그: 상태 플래그 검사 및 설정[29]
6. 2. 권장 연산
IEEE 754 표준의 9조에서는 언어 표준에서 정의해야 하는 추가적인 수학 연산을 권장한다.[42] 다만, 표준 준수를 위해 이러한 연산들이 반드시 필요한 것은 아니다.[43]권장되는 산술 연산은 다음과 같으며, 이들은 올바르게 반올림되어야 한다.[44]
- ex, 2x, 10x
- ex - 1, 2x - 1, 10x - 1
- ln x, log2 x, log10 x
- ln(1 + x), log2(1 + x), log10(1 + x)
- √(x2 + y2)
- 1/√x
- x ≥ -1일 때 (1 + x)n (''복리''라고 하며, −1보다 작을 수 없는 지수 성장을 계산하는 데 사용됨)[45]
- x1/n
- xn, xy
- sin x, cos x, tan x
- arcsin x, arccos x, arctan x, atan2(y, x)
- sinπ x = sin πx, cosπ x = cos πx, tanπ x = tan πx (π의 배수 참조)
- asinπ x = (1/π)arcsin x, acosπ x = (1/π)arccos x, atanπ x = (1/π)arctan x, atan2π(y, x) = (1/π)atan2(y, x) (π의 배수 참조)
- sinh x, cosh x, tanh x
- arsinh x, arcosh x, artanh x
asinπ, acosπ 및 tanπ 함수는 덜 필요하다고 판단되어 IEEE 754-2008 표준에는 포함되지 않았으나,[46] 2019년 개정판에서 추가되었다.[4]
권장 연산에는 동적 모드 반올림 방향 설정 및 접근[47], 표준에서 정확도가 명시되지 않은 합계, 가중곱, 점곱과 같은 구현 정의 벡터 축소 연산도 포함된다.[48]
7. 예외 처리
IEEE 754 부동소수점 표준은 예외적인 조건(0으로 나누기, 오버플로 등)을 처리하기 위해 다섯 가지 예외를 정의한다.[33][34] 각 예외는 기본값을 반환하며, 예외가 발생할 때 상태 플래그가 설정된다.
표준은 사용자 정의 기본값의 사전 대입, 제어 흐름을 변경하는 트랩(예외) 및 try/catch와 같이 흐름을 중단하는 기타 예외 처리 모델을 포함하여 다양한 형태의 선택적 예외 처리를 권장한다. 그러나 트랩 및 기타 예외 메커니즘은 선택 사항이다.
일부 십진 부동 소수점 구현에서는 IEEE 754의 일부가 아닌 추가적인 예외를 정의하기도 한다. 예를 들어, 결과의 지수가 너무 커서 대상 형식에 맞지 않는 경우 발생하는 클램핑(Clamping) 예외나, 결과의 계수에 대상 형식에서 제공하는 것보다 더 많은 자릿수가 필요할 때 발생하는 반올림(Rounding) 예외가 있다.
7. 1. 예외 종류
IEEE 754 표준은 다섯 가지 예외를 정의하며, 각 예외는 기본값을 반환하고 예외 발생 시 상태 플래그를 발생시킨다.- 잘못된 연산: 수학적으로 정의되지 않은 연산(예: 음수의 제곱근)을 시도할 때 발생한다. 기본적으로 qNaN(Quiet NaN)을 반환한다.[33][34]
- 0으로 나누기: 유한 피연산자에 대한 연산 결과가 무한대가 되는 경우(예: 1/0 또는 log(0))에 발생한다. 기본적으로 ±무한대를 반환한다.[33][34]
- 오버플로우: 결과값이 표현 가능한 범위를 초과하여 너무 커질 때 발생한다. 기본적으로 반올림 모드에 따라 ±무한대를 반환한다.[33][34]
- 언더플로우: 결과값이 너무 작아 정규 범위 밖에 있을 때 발생한다. 기본적으로 크기가 최소 양의 정규수보다 작거나 같은 수를 반환하며, 비정규수는 항상 언더플로우 예외를 의미한다.[33][34]
- 부정확: 정확한 결과값을 표현할 수 없을 때 발생한다. 기본적으로 올바르게 반올림된 결과를 반환한다.[33][34]
이 예외들은 IEEE 754-1985에 정의된 것과 동일하지만, '0으로 나누기' 예외는 나눗셈 외의 연산으로 확장되었다.
8. 특수 값
IEEE 754 표준은 부동소수점 수 표현에서 일반적으로 사용되는 몇 가지 특수 값을 정의한다. 이러한 특수 값에는 부호 있는 영, 비정규수, 무한대, 그리고 NaN(Not a Number)이 있다.
- 부호 있는 영: 0은 양의 0(+0)과 음의 0(-0)으로 표현될 수 있다.
- 비정규수: 매우 작은 값을 표현하며, 정규화된 수로는 표현할 수 없는 0에 가까운 수들을 나타낸다.
- 무한대: 양의 무한대(+∞)와 음의 무한대(-∞)를 표현하며, 오버플로우 발생 시 대체 값으로 사용될 수 있다.
- NaN (Not a Number): 정의되지 않거나 잘못된 연산의 결과를 나타내는 값으로, 정적 NaN(Quiet NaN)과 신호 NaN(Signaling NaN) 두 종류가 있다.
단정밀도 부동소수점 수에서 지수부는 편향 표현(바이어스 또는 엑세스라고도 함) 형식을 사용하며, 실제 값에 어떤 고정값(여기서는 ''emax'' = 127)을 더한 것이다. 이는 부동소수점 수끼리의 대소 비교를 용이하게 하기 위함이다. 지수부는 음수가 될 수 있지만, 2의 보수로 표현하면 전체 부호 외에 지수부도 부호를 갖게 되어 대소 비교가 어려워진다. 따라서 지수부는 항상 양수가 되도록 편향되어 저장된다. 부동소수점 수를 해석할 때는 편향을 빼서 실제 지수를 구한다.
배정밀도 부동소수점 수도 각 필드의 너비가 넓어진 것일 뿐, 기본적인 개념은 같다.[78] 정규화수에서 지수는 emax = +1023으로 바이어스된다 (따라서 e는 지수 - 1023). 정규화수의 지수는 e: +1023 ~ -1022 (지수: 2046 ~ 1)이다 (지수 = 2047일 때 무한대 또는 NaN, 지수 = 0일 때 비정규화수로 e = -1022). 정규화수일 때 가수부는 숨김 표현이다.
8. 1. 부호 있는 영 (Signed zero)
IEEE 754 표준에서 0은 부호가 있어, "양의 영"(+0)과 "음의 영"(-0)이 모두 존재한다. 대부분의 실행 환경에서 양의 영은 일반적으로 "0
"으로, 음의 영은 "-0
"으로 표시된다. 두 값은 수치 비교에서 동일하게 동작하지만, 일부 연산은 +0과 -0에 대해 다른 결과를 반환한다. 예를 들어, 1/(-0)은 음의 무한대를 반환하는 반면, 1/(+0)은 양의 무한대를 반환한다.[78] +0과 -0을 다르게 처리할 수 있는 ''x''=0에서의 불연속성을 갖는 다른 일반적인 함수에는 감마 함수(x)와 음수 ''y''에 대한 주 제곱근이 포함된다.8. 2. 비정규화수 (Subnormal numbers)
IEEE 754 표준에서 비정규화수는 매우 작은 값을 표현하기 위해 사용된다. 이 값들은 정규화된 수로는 표현할 수 없는, 0에 매우 가까운 수들이다.비정규화수는 언더플로우 간격을 채우며, 이 값들 사이의 절대 거리는 언더플로우 간격 바로 바깥쪽에 있는 인접한 값들과 같다. 이는 0만 사용하는 방식(flush to zero)보다 개선된 것이다.[36]
최신 부동 소수점 하드웨어는 일반적으로 비정규수를 처리하며, 소프트웨어 에뮬레이션이 필요하지 않다.
정규화수 이외의 경우, 비정규화수는 다음과 같이 표현된다.
- `q` = -126이며, `c` = 0.fraction이다. (`q`는 -127이 아니다. 가수의 소수점 이상 부분이 0이 되므로 지수를 -126으로 하여 균형을 맞춘다.)
종류 | exponent (지수부) | fraction (가수부) |
---|---|---|
영 | 0 | 0 |
비정규화수 | 0 | 0 이외 |
정규화수 | 1 – 254 | 임의 |
무한대 | 255 | 0 |
NaN | 255 | 0 이외의 임의 |
8. 3. 무한대 (Infinities)
확장된 실수선의 무한대는 1, 1.5와 같은 일반적인 부동소수점 값처럼 IEEE 부동소수점 데이터 형식으로 표현될 수 있다. 이는 오류 값은 아니지만, 오버플로우가 발생할 때 대체 값으로 사용될 수 있다. 0으로 나누기 예외가 발생하면 양의 무한대 또는 음의 무한대가 정확한 결과로 반환된다. 무한대는 숫자로도 도입될 수 있다(C의 "INFINITY" 매크로 또는 프로그래밍 언어가 해당 구문을 허용하는 경우와 같이).[78]IEEE 754에서는 다음과 같이 무한대를 합리적인 방식으로 처리해야 한다.[78]
- (+∞) + (+7) = (+∞)
- (+∞) × (−2) = (−∞)
- (+∞) × 0 = NaN – 의미 있는 작업이 없다
8. 4. NaN (Not a Number)
IEEE 754 표준은 0/0, , sqrt(−1) 등과 같이 정의되지 않거나 잘못된 연산의 결과를 나타내기 위해 "NaN"(Not a Number, 숫자가 아님)이라는 특별한 값을 사용한다.[78] NaN은 일반적으로 연산 과정에서 전파된다. 즉, NaN을 포함하는 대부분의 연산은 NaN을 결과로 반환한다. 그러나 NaN이 입력되어도 특정 결과를 제공하는 함수는 NaN에 대해서도 동일한 결과를 제공한다. (예: NaN0 = 1)NaN에는 두 가지 종류가 있다.
- 정적 NaN (Quiet NaN): 기본적으로 사용되는 NaN이다.
- 신호 NaN (Signaling NaN): 산술 연산(숫자 비교 포함)에서 사용될 때 "잘못된 연산" 예외를 발생시킨다.
NaN의 표현에는 오류 유형이나 원인을 나타내는 데 사용할 수 있는 추가적인 비트들이 있지만, 이러한 비트의 인코딩에 대한 표준은 없다. 이론적으로 신호 NaN은 초기화되지 않은 변수에 표시를 하거나, 부동소수점 숫자에 다른 특수 값을 확장하는 등의 용도로 사용될 수 있지만, 일반적으로 사용되지는 않는다.
NaN은 지수부가 모두 1이고 (10진수로 255), 가수부가 0이 아닌 임의의 값으로 표현된다.[78]
종류 | exponent(지수부) | fraction(가수부) |
---|---|---|
NaN | 255 | 0 이외의 임의 |
NaN에도 부호와 가수부분이 있지만, 분석 이외의 목적에서는 사용할 수 없다. 가수 부분의 첫 번째 비트를 사용하여 "signaling NaN"과 "quiet NaN"을 구별할 수 있다.
9. 표현
IEEE 754 부동소수점 표기 표준은 산술 형식, 형식 교환, 반올림 규칙, 작동, 예외 처리 등을 정의한다. 산술 형식은 유한한 수, 무한대, NaN(Not a Number) 값으로 구성된 이진수 및 십진수 부동소수점 데이터 집합이다. 형식 교환은 부동소수점 데이터를 효율적이고 압축적으로 전환하는 인코딩을 의미한다.[7]
부동 소수점 형식은 기수(base) ''b''(2 또는 10), 정밀도(precision) ''p'', 지수 범위(exponent range) ''emin''부터 ''emax''로 지정된다. 형식은 유한수, 두 개의 무한대(+∞와 −∞), 두 종류의 NaN(조용한 NaN과 신호 NaN)으로 구성된다. 유한수는 부호 ''s''(0 또는 1), 유효숫자 ''c''(기수 ''b''로 표현했을 때 ''p''자리 이하), 지수 ''q''로 표현되며, 그 값은 (−1)''s'' × ''c'' × ''b''''q''이다.
십진수 형식의 경우 모든 표현이 유효하며, 이진수 형식의 경우 값을 정확하게 표현할 수 있는 가장 작은 지수를 선택하여 표현 방식을 고유하게 만든다. 이진수 형식에서는 최상위 비트 규칙을 통해 정밀도를 한 비트 더 높일 수 있다. NaN은 부호 비트와 페이로드(payload)를 포함할 수 있으며, 페이로드는 NaN의 원인을 나타내는 진단 정보나 다른 용도로 사용될 수 있다.[8][9][10]
표준에서는 기본 형식과 외부 문자열 형식 간의 변환 연산을 요구하며, 10진수 문자 형식으로의 변환 및 그 반대 변환이 필요하다.[54]
9. 1. 십진수-이진수 변환
IEEE 754 표준에서는 십진수 문자열을 이진 부동소수점 수로, 또는 그 반대로 변환하는 연산을 요구한다.[54] 이러한 변환은 모든 형식에 대해 요구되며, 변환 과정에서 정보 손실을 최소화하고 정확도를 유지하기 위해 반올림 규칙이 적용된다.외부 문자열로 변환 시, 가장 가까운 쪽으로 반올림하고 동률은 짝수 쪽으로 처리하는 방법을 사용하여 원래 숫자를 복구할 수 있도록 해야 한다. 정적 NaN 또는 신호 NaN의 페이로드를 보존할 필요는 없으며, 외부 문자열에서의 변환은 신호 NaN을 정적 NaN으로 바꿀 수 있다.
다음은 이진수와 십진수 간 변환 시 원래 값을 보존하기 위해 필요한 십진수 자릿수이다.[55]
이진 형식 | 필요한 십진수 자릿수 |
---|---|
binary16 | 5 |
binary32 | 9 |
binary64 | 17 |
binary128 | 36 |
다른 이진수 형식의 경우 필요한 십진수 자릿수는 다음 식으로 계산할 수 있다.
:
여기서 ''p''는 이진수 형식의 유효 자릿수이다. (예: binary256의 경우 237비트)
십진수 부동 소수점 형식의 경우, 십진수 표현을 보존하기 위해 필요한 자릿수는 다음과 같다.
십진 형식 | 필요한 십진수 자릿수 |
---|---|
decimal32 | 7 |
decimal64 | 16 |
decimal128 | 34 |
이진수와 십진수 간의 변환을 올바르게 반올림하면서 수행하는 알고리즘이 연구되고 있다.[76][77]
9. 2. 16진수 리터럴
IEEE 754-2008 표준에서는 16진수 부동소수점 리터럴을 지원한다. 이는 C99 표준의 16진수 부동소수점 리터럴 형식을 기반으로 한다.[58] 이러한 리터럴은 이진 부동소수점 수를 더 정확하게 표현하고 교환할 수 있도록 돕는다.16진수 부동소수점 리터럴의 형식은 다음과 같다.
- 선택적 부호: `+` 또는 `-`
- 지시자: `0x`
- 16진수 (마침표 포함 또는 미포함)
- 지수 지시자: `p`
- 선택적 부호가 있는 10진수 지수
이 구문은 대소문자를 구분하지 않는다.[58] 10진수 지수는 2의 거듭제곱으로 배율을 조정한다. 예를 들어, `0x0.1p0`은 1/16이고 `0x0.1p-4`는 1/256이다.[59]
참조
[1]
논문
IEEE 754
2019
[2]
웹사이트
FW: ISO/IEC/IEEE 60559 (IEEE Std 754-2008)
http://grouper.ieee.[...]
2018-04-04
[3]
웹사이트
ISO/IEEE Partner Standards Development Organization (PSDO) Cooperation Agreement
https://grouper.ieee[...]
ISO
2021-12-27
[4]
웹사이트
IEEE 754-2008 errata
https://speleotrove.[...]
2013-11-13
[5]
웹사이트
ANSI/IEEE Std 754-2019
https://754r.ucbtest[...]
2024-01-16
[6]
웹사이트
Issues for the next revision of 754
https://grouper.ieee[...]
2024-08-12
[7]
논문
IEEE 754
2008
[8]
웹사이트
SpiderMonkey Internals
https://udn.realityr[...]
2018-03-11
[9]
서적
21st Century C: C Tips from the New School
https://books.google[...]
O'Reilly Media, Incorporated
2018-03-11
[10]
웹사이트
zuiderkwast/nanbox: NaN-boxing in C
https://github.com/z[...]
2018-03-11
[11]
논문
IEEE 754
2008
[12]
논문
IEEE 754
2008
[13]
논문
IEEE 754
2008
[14]
논문
IEEE 754
2008
[15]
서적
Motorola MC68000 Family
https://www.nxp.com/[...]
NXP Semiconductors
[16]
논문
IEEE 754
2008
[17]
논문
IEEE 754
2008
[18]
논문
IEEE 754
2019
[19]
논문
IEEE 754
2008
[20]
논문
IEEE 754
2008
[21]
논문
IEEE 754
2008
[22]
논문
IEEE 754
2008
[23]
논문
IEEE 754
2008
[24]
논문
IEEE 754
2008
[25]
논문
IEEE 754
2008
[26]
논문
IEEE 754
2008
[27]
논문
IEEE 754
2008
[28]
논문
IEEE 754
2008
[29]
논문
IEEE 754
2008
[30]
논문
IEEE 754
2019
[31]
논문
IEEE 754
2019
[32]
웹사이트
Implement total_cmp for f32, f64 by golddranks · Pull Request #72568 · rust-lang/rust
https://github.com/r[...]
[33]
웹사이트
9.4. decimal — Decimal fixed point and floating point arithmetic — Python 3.6.5 documentation
https://docs.python.[...]
2018-04-04
[34]
웹사이트
Decimal Arithmetic - Exceptional conditions
http://speleotrove.c[...]
2018-04-04
[35]
논문
IEEE 754
2008
[36]
서적
Handbook of Floating-Point Arithmetic
https://books.google[...]
Birkhäuser
2010
[37]
웹사이트
How Java's floating-point hurts everyone everywhere
http://www.cs.berkel[...]
2003-09-05
[38]
웹사이트
Why do we need a floating-point arithmetic standard?
http://www.cs.berkel[...]
1981-02-12
[39]
웹사이트
An Interview with the Old Man of Floating-Point
http://www.eecs.berk[...]
1998-02-20
[40]
웹사이트
The Baleful Effect of Computer Benchmarks upon Applied Mathematics, Physics and Chemistry
http://www.cs.berkel[...]
1996-06-11
[41]
웹사이트
radix tricks
http://stereopsis.co[...]
2001-12
[42]
간행물
IEEE 754
2019
[43]
간행물
IEEE 754
2008
[44]
간행물
IEEE 754
2019
[45]
웹사이트
Too much power - pow vs powr, powd, pown, rootn, compound
https://grouper.ieee[...]
2024-01-16
[46]
웹사이트
Re: Missing functions tanPi, asinPi and acosPi
http://grouper.ieee.[...]
2018-04-04
[47]
간행물
IEEE 754
2008
[48]
간행물
IEEE 754
2008
[49]
간행물
IEEE 754
2019
[50]
웹사이트
Augmented Arithmetic Operations Proposed for IEEE-754 2018
http://www.ecs.umass[...]
25th IEEE Symbosium on Computer Arithmetic (ARITH 2018)
2019-07-23
[51]
웹사이트
ANSI/IEEE Std 754-2019 – Background Documents
https://grouper.ieee[...]
2024-01-16
[52]
간행물
IEEE 754
2019
[53]
웹사이트
The Removal/Demotion of MinNum and MaxNum Operations from IEEE 754-2018
https://grouper.ieee[...]
2024-01-16
[54]
간행물
IEEE 754
2008
[55]
간행물
IEEE 754
2008
[56]
논문
Correctly rounded binary-decimal and decimal-binary conversions
http://citeseer.ist.[...]
AT&T Laboratories
1990-11-30
[57]
논문
A Program for Testing IEEE Decimal–Binary Conversion
1991-05-22
[58]
간행물
IEEE 754
2008
[59]
웹사이트
6.9.3. Hexadecimal floating point literals — Glasgow Haskell Compiler 9.3.20220129 User's Guide
https://ghc.gitlab.h[...]
2022-01-29
[60]
웹사이트
Floating point (GNU Coreutils 9.0)
https://www.gnu.org/[...]
2020-04-10
[61]
웹사이트
厳密な浮動小数点演算セマンティクスのJava実行時コンパイラへの実装
http://id.nii.ac.jp/[...]
2020-04-10
[62]
메일링리스트
FW: ISO/IEC/IEEE 60559 (IEEE Std 754-2008)
http://grouper.ieee.[...]
2012-04-10
[63]
웹사이트
ISO/IEC/IEEE 60559:2011
https://www.iso.org/[...]
2020-04-10
[64]
일반
[65]
일반
[66]
일반
[67]
간행물
IEEE 754
2008
[68]
간행물
IEEE 754
2008
[69]
간행물
IEEE 754
2008
[70]
웹사이트
RE: Two technical questions on IEEE Std 754-2008
http://grouper.ieee.[...]
2012-04-10
[71]
논문
IEEE 754
2008
[72]
논문
IEEE 754
2008
[73]
논문
IEEE 754
2008
[74]
논문
IEEE 754
2008
[75]
논문
IEEE 754
2008
[76]
논문
Correctly rounded binary-decimal and decimal-binary conversions
http://citeseer.ist.[...]
AT&T Laboratories
1990-11-30
[77]
논문
A Program for Testing IEEE Decimal–Binary Conversion
http://citeseerx.ist[...]
2012-03-28
[78]
서적
An Introduction to Numerical Methods A MATLAB Approach
학산미디어
2013
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com