상위 질문
타임라인
채팅
관점
IEEE 754
부동소수점 연산을 위한 기술 표준 위키백과, 무료 백과사전
Remove ads
IEEE 부동소수점 연산 표준(IEEE Standard for Floating-Point Arithmetic, IEEE 754)은 전기전자공학자협회(IEEE)가 1985년에 처음 제정한 부동소수점 연산을 위한 기술 표준이다. 이 표준은 다양한 부동소수점 구현에서 발견되어 신뢰성 있고 이식성 있게 사용하기 어렵게 만들었던 많은 문제들을 해결했다. 많은 하드웨어 부동소수점 장치는 IEEE 754 표준을 사용한다.
표준은 다음을 정의한다.
- 연산 형식: 이진 코드 및 십진법 부동소수점 데이터 집합으로, 유한 숫자(부호 있는 0 및 비정규 값 포함), 무한대, 특별한 "숫자가 아님" 값(NaNs)으로 구성된다.
- 교환 형식: 부동소수점 데이터를 효율적이고 간결한 형태로 교환하는 데 사용될 수 있는 인코딩(비트 문자열)
- 반올림 규칙: 연산 및 변환 시 숫자를 반올림할 때 충족해야 할 속성
- 연산: 연산 형식에 대한 산술 및 기타 연산(삼각 함수 등)
- 예외 처리: 예외 조건(0으로 나누기, 오버플로 등) 표시
2008년 8월에 발행된 IEEE 754-2008에는 원래의 IEEE 754-1985 표준의 거의 모든 내용과 IEEE 854-1987(기수 독립 부동소수점 연산) 표준이 포함되어 있다. 현재 버전인 IEEE 754-2019는 2019년 7월에 발행되었다.[1] 이는 주로 명확화, 결함 수정 및 새로운 권장 연산을 통합한 이전 버전의 사소한 수정이다.
Remove ads
역사
요약
관점
1960년대와 1970년대에 비즈니스 및 과학 컴퓨팅 산업의 혼란으로 인해 부동소수점 표준의 필요성이 대두되었다. IBM은 IBM 16진 부동소수점 형식을 사용했다. CDC 및 Cray 컴퓨터는 +0 및 −0 값을 허용하는 1의 보수 표현을 사용했다. CDC 60비트 컴퓨터에는 완전한 60비트 가산기가 없었으므로 정수 연산은 부동소수점 장치에서 48비트 정밀도로 제한되었다. 0으로 나누기 예외 처리는 컴퓨터마다 달랐다. 시스템 간에 데이터를 이동하거나 다른 시스템에서 동일한 계산을 반복하는 것이 종종 어려웠다.
부동소수점 연산을 위한 최초의 IEEE 표준인 IEEE 754-1985는 1985년에 발행되었다. 이 표준은 이진 부동소수점 연산만 다루었다.
댄 주라스가 의장을 맡고 마이크 카울리쇼가 편집한 7년 간의 개정 과정을 거쳐 새로운 버전인 IEEE 754-2008이 2008년 8월에 발행되었다. 이 표준은 IEEE 754-1985(이진 부동소수점 연산)와 IEEE 854-1987(기수 독립 부동소수점 연산) 표준을 모두 대체했다. 원래 표준의 이진 형식은 이 새로운 표준에 포함되었으며, 하나의 이진 형식과 두 개의 십진 형식이라는 세 가지 새로운 기본 형식이 추가되었다. 현재 표준을 준수하려면 구현은 기본 형식 중 하나 이상을 연산 형식과 교환 형식으로 모두 구현해야 한다.
IEEE 754-2008과 내용이 동일한 국제 표준 ISO/IEC/IEEE 60559:2011은 ISO/IEC JTC 1/SC 25를 통해 ISO/IEEE PSDO 계약에 따라 채택이 승인되고 발행되었다.[2][3][4]
2019년 7월에 발행된 현재 버전인 IEEE 754-2019는 2015년 9월에 시작된 개정 과정을 거쳐 데이비드 G. 호프가 의장을 맡고 마이크 카울리쇼가 편집하여 IEEE 754-2008에서 파생되었으며 이를 대체한다. 이 버전은 주로 명확화(예: totalOrder) 및 결함 수정(예: minNum)을 통합했지만, 일부 새로운 권장 연산(예: augmentedAddition)도 포함한다.[5][6]
IEEE 754-2019와 내용이 동일한 국제 표준 ISO/IEC 60559:2020은 ISO/IEC JTC 1/SC 25를 통해 채택이 승인되고 발행되었다.[7]
표준의 다음 개정은 2029년으로 예정되어 있다.[8]
Remove ads
형식
요약
관점
IEEE 754 형식은 "숫자 값 및 기호 표현의 집합"이다. 형식은 집합이 인코딩되는 방식도 포함할 수 있다.[9]
부동소수점 형식은 다음으로 지정된다.
- 기수 b: IEEE 754에서는 2(이진) 또는 10(십진)
- 정밀도 p
- emin에서 emax까지의 지수 범위, 모든 IEEE 754 형식에서 emin = 1 − emax 또는 이와 동등하게 emin = − (emax − 1)
형식은 다음으로 구성된다.
- 세 개의 정수로 설명될 수 있는 유한 숫자: s = 부호(0 또는 1), c = 기수 b로 쓸 때 p자리를 넘지 않는 유효숫자(계수 또는 가수라고도 함)(즉, 0에서 bp − 1까지의 정수), q = emin ≤ q + p − 1 ≤ emax를 만족하는 지수. 이러한 유한 숫자의 숫자 값은 (−1)s × c × bq이다.[a] 또한, 부호 있는 0이라고 하는 두 개의 0값이 있다. 부호 비트는 0이 +0(양의 0)인지 −0(음의 0)인지를 지정한다.
- 두 개의 무한대: +∞ 및 −∞.
- 두 종류의 NaN(숫자가 아님): qNaN(조용한 NaN) 및 sNaN(신호 NaN).
예를 들어, b = 10, p = 7, emax = 96이면 emin = −95, 유효숫자는 0 ≤ c ≤ 9999999를 만족하며, 지수는 −101 ≤ q ≤ 90을 만족한다. 따라서 표현할 수 있는 가장 작은 0이 아닌 양수는 1×10−101이고, 가장 큰 양수는 9999999×1090(9.999999×1096)이므로, 숫자의 전체 범위는 −9.999999×1096부터 9.999999×1096까지이다. −b1−emax 및 b1−emax(여기서는 −1×10−95 및 1×10−95)는 가장 작은(크기 기준) 정규 숫자이다. 이 가장 작은 숫자들 사이에 있는 0이 아닌 숫자들은 비정규 값이라고 한다.
메모리 표현 및 인코딩
일부 숫자는 여러 개의 부동소수점 표현을 가질 수 있다. 예를 들어, b = 10, p = 7이면 −12.345는 −12345×10−3, −123450×10−4, −1234500×10−5로 표현될 수 있다. 그러나 산술 연산과 같은 대부분의 연산에서 결과(값)는 입력의 표현에 의존하지 않는다.
십진 형식의 경우 모든 표현이 유효하며, 이러한 표현의 집합을 코호트라고 한다. 결과가 여러 표현을 가질 수 있을 때, 표준은 코호트의 어떤 구성원이 선택되는지를 지정한다.
이진 형식의 경우, 값을 정확하게 표현할 수 있는 가장 작은 표현 가능 지수를 선택하여 표현이 고유하게 만들어진다. 또한, 지수는 직접 표현되지 않고, 가장 작은 표현 가능 지수가 1로 표현되고 0은 비정규 값에 사용되도록 바이어스가 추가된다. 정규 범위 내의 지수를 가진 숫자(지수 필드가 모두 1이거나 모두 0이 아님)의 경우, 유효숫자의 선행 비트는 항상 1이다. 결과적으로, 선행 1은 메모리 인코딩에 명시적으로 존재하기보다는 암시될 수 있으며, 표준에 따라 유효숫자의 명시적으로 표현된 부분은 0과 1 사이에 놓인다. 이 규칙은 선행 비트 규칙, 암시 비트 규칙 또는 숨겨진 비트 규칙이라고 불린다. 이 규칙은 이진 형식이 추가 비트 정밀도를 가질 수 있도록 한다. 선행 비트 규칙은 비정규 값에 사용할 수 없는데, 이는 비정규 값이 정규 지수 범위를 벗어나고 가장 작은 정규 값에 사용되는 가장 작은 표현된 지수에 따라 스케일링되기 때문이다.
여러 인코딩 가능성(적어도 교환 형식이라고 불리는 형식에서)으로 인해, NaN은 다른 정보를 가질 수 있다: 부호 비트(의미는 없지만 일부 연산에서 사용될 수 있음) 및 페이로드, 이는 NaN의 소스를 나타내는 진단 정보를 위한 것이다(그러나 페이로드는 NaN-boxing과 같은 다른 용도로 사용될 수 있음[10][11][12]).
기본 및 교환 형식
이 표준은 숫자 기수와 교환 인코딩에 사용되는 비트 수를 기준으로 이름이 지정된 5가지 기본 형식을 정의한다. 32, 64, 128비트로 인코딩되는 3가지 이진 부동소수점 기본 형식과 64 또는 128비트로 인코딩되는 2가지 십진 부동소수점 기본 형식이 있다. binary32 및 binary64 형식은 각각 IEEE 754-1985의 단일 및 이중 형식이다. 준수하는 구현은 기본 형식 중 하나 이상을 완전히 구현해야 한다.
이 표준은 또한 이러한 기본 형식을 일반화하는 교환 형식을 정의한다.[13] 이진 형식의 경우, 선행 비트 규칙이 필요하다. 다음 표는 가능한 교환 형식(기본 형식 포함) 중 일부를 요약한 것이다.
위 표에서 정수 값은 정확한 값이며, 소수점 표기법(예: 1.0)의 값은 반올림된 값이다. 나열된 최소 지수는 정규 숫자에 대한 것이다. 특별한 비정규 값 표현은 정밀도의 일부 손실과 함께 더 작은(크기 면에서) 숫자를 표현할 수 있게 한다. 예를 들어, binary64에서 표현할 수 있는 가장 작은 양수는 2−1074이다. −1074라는 수치에 기여하는 요소는 emin 값 −1022와 53개의 유효숫자 비트 중 하나를 제외한 모든 비트(2−1022 − (53 − 1) = 2−1074)를 포함한다.
십진 자릿수는 해당 십진 자릿수로 표현된 형식의 정밀도이다. 이는 자릿수 × log10 기수로 계산된다. 예를 들어, binary128은 약 34자리 십진수와 동일한 정밀도를 가진다.
log10 MAXVAL은 인코딩 범위의 척도이다. 그 정수 부분은 유효숫자에 선행 자릿수 하나를 가진 과학적 표기법으로 값의 출력에 표시되는 가장 큰 지수이다(예: 1.698×10 38은 binary32의 가장 큰 값에 가깝고, 9.999999×10 96은 decimal32의 가장 큰 값이다).
binary32(단일) 및 binary64(이중) 형식은 오늘날 가장 일반적으로 사용되는 형식 중 두 가지이다. 아래 그림은 값의 범위에 대한 두 형식의 절대 정밀도를 보여준다. 이 그림은 숫자의 예상 값과 필요한 정밀도를 고려하여 적절한 형식을 선택하는 데 사용될 수 있다.

32비트 부동소수점의 레이아웃 예시는 다음과 같다.

그리고 64비트 레이아웃도 유사하다.
확장 및 확장 가능 정밀도 형식
표준은 기본 형식보다 더 큰 정밀도를 제공하는 선택적인 확장 및 확장 가능 정밀도 형식을 지정한다.[14] 확장 정밀도 형식은 더 많은 정밀도와 더 넓은 지수 범위를 사용하여 기본 형식을 확장한다. 확장 가능 정밀도 형식은 사용자가 정밀도와 지수 범위를 지정할 수 있도록 한다. 구현은 이러한 형식에 대해 원하는 내부 표현을 사용할 수 있다. 정의되어야 할 것은 매개변수(b, p, emax)뿐이다. 이러한 매개변수는 주어진 기수에 대한 부호, 유효숫자, 지수의 조합인 유한 숫자 집합을 고유하게 설명한다.
표준은 언어 표준이 지원되는 각 기수 b에 대해 p와 emax를 지정하는 방법을 제공하도록 권장한다.[15] 표준은 언어 표준 및 구현이 각 기수 b에 대해 지원되는 가장 큰 기본 형식보다 더 큰 정밀도를 가진 확장 형식을 지원하도록 권장한다.[16] 두 기본 형식 사이에 정밀도를 가진 확장 형식의 경우 지수 범위는 다음으로 넓은 기본 형식의 지수 범위 이상이어야 한다. 따라서 예를 들어 64비트 확장 정밀도 이진수는 적어도 16383의 'emax'를 가져야 한다. X87 80비트 확장 형식은 이 요구 사항을 충족한다.
원래의 IEEE 754-1985 표준도 확장 형식의 개념을 가지고 있었지만, emin과 emax 사이에 의무적인 관계는 없었다. 예를 들어, 모토로라 68881 80비트 형식[17]은 emin = − emax였고, 이는 적합한 확장 형식이었지만 2008년 개정에서는 비적합이 되었다.
교환 형식
교환 형식은 주어진 형식에 대해 고정 길이의 비트 문자열을 사용하여 부동소수점 데이터를 교환하기 위한 것이다.
이진
이진 부동소수점 숫자의 교환을 위해 16비트, 32비트, 64비트, 그리고 128비트 이상의 32비트의 모든 배수 길이의 교환 형식이 정의되어 있다.[e] 16비트 형식은 작은 숫자(예: 그래픽)의 교환 또는 저장을 위한 것이다.
이러한 이진 교환 형식의 인코딩 스키마는 IEEE 754-1985와 동일하다: 부호 비트, 그 뒤에 바이어스로 오프셋된 지수를 설명하는 w개의 지수 비트, 그리고 유효숫자를 설명하는 p − 1개의 비트. k비트 형식의 지수 필드 너비는 w = round(4 log2(k)) − 13으로 계산된다. 기존의 64비트 및 128비트 형식은 이 규칙을 따르지만, 16비트 및 32비트 형식은 이 공식이 제공하는 것보다 더 많은 지수 비트(각각 5 및 8)를 가진다(각각 3 및 7).
IEEE 754-1985와 마찬가지로, 바이어스 지수 필드는 모두 1 비트로 채워져 무한대(유효숫자 필드 = 0) 또는 NaN(유효숫자 필드 ≠ 0)을 나타낸다. NaN의 경우, 조용한 NaN과 신호 NaN은 유효숫자 필드의 최상위 비트를 독점적으로 사용하여 구분되며,[f] 페이로드는 나머지 비트에 전달된다.
십진
십진 부동소수점 숫자의 교환을 위해 32비트의 모든 배수의 교환 형식이 정의된다. 이진 교환과 마찬가지로, 십진 교환 형식의 인코딩 스키마는 부호, 지수 및 유효숫자를 인코딩한다. 두 가지 다른 비트 수준 인코딩이 정의되어 있으며, 사용 중인 인코딩에 대한 외부 지시자가 필요할 수 있다는 사실 때문에 교환이 복잡하다.
두 가지 옵션은 유효숫자를 밀집된 십진 코드를 사용하여 압축된 십진수 시퀀스로 인코딩하거나, 또는 이진 정수로 인코딩할 수 있게 한다. 전자는 표준의 직접적인 하드웨어 구현에 더 편리하고, 후자는 이진 컴퓨터에서 소프트웨어 에뮬레이션에 더 적합하다. 어느 경우든, 인코딩될 수 있는 숫자 집합(부호, 유효숫자, 지수의 조합)은 동일하며, 특수 값(최소 지수를 가진 ±0, ±무한대, 조용한 NaN, 신호 NaN)은 동일한 인코딩을 가진다.
Remove ads
반올림 규칙
요약
관점
이 표준은 다섯 가지 반올림 규칙을 정의한다. 처음 두 규칙은 가장 가까운 값으로 반올림하고, 나머지는 방향성 반올림이라고 한다.
가장 가까운 값으로 반올림
- 가장 가까운 짝수로 반올림 – 가장 가까운 값으로 반올림한다. 숫자가 중간에 있을 경우, 가장 낮은 유효 숫자가 짝수인 가장 가까운 값으로 반올림된다.
- 가장 가까운 0에서 멀리 반올림 (또는 0에서 멀리') – 가장 가까운 값으로 반올림한다. 숫자가 중간에 있을 경우, 양수는 위로, 음수는 아래로 가장 가까운 값으로 반올림된다.
극단적인 경우, 보다 절대값이 엄격히 작은 값은 최소 또는 최대 유한 숫자(값의 부호에 따라 다름)로 반올림된다. 정확히 이 크기를 가진 숫자들은 타이로 간주된다. 이러한 타이 선택은 와 사이의 중간점으로 개념화될 수 있으며, 지수가 제한되지 않는다면 크기가 더 큰 다음 표현 가능한 부동소수점 숫자가 될 것이다. k보다 절대값이 엄격히 큰 숫자들은 해당 무한대로 반올림된다.[18]
"가장 가까운 짝수로 반올림"은 이진 부동소수점의 기본값이며 십진수의 권장 기본값이다. "가장 가까운 0에서 멀리 반올림"은 십진수 구현에만 필요하다.[19]
방향성 반올림
- 0으로 반올림 – 0 방향으로 반올림(절단이라고도 함).
- +∞로 반올림 – 양의 무한대 방향으로 반올림(올림 또는 천장 함수라고도 함).
- −∞로 반올림 – 음의 무한대 방향으로 반올림(내림 또는 바닥 함수라고도 함).
별도로 지정되지 않는 한, 연산의 부동소수점 결과는 무한 정밀도(수학적) 결과에 반올림 함수를 적용하여 결정된다. 이러한 연산을 정확하게 반올림되었다고 한다. 이 요구 사항을 정확한 반올림이라고 한다.[20]
Remove ads
필수 연산
요약
관점
지원되는 산술 형식(기본 형식 포함)에 대한 필수 연산은 다음과 같다.
- 정수 변환 및 정수로부터의 변환[21][22]
- 이전 및 다음 연속 값[21]
- 산술 연산(덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근, 융합 곱셈-덧셈, 나머지, 최소, 최대)[21][22]
- 변환(형식 간, 문자열 변환 등)[23][24]
- 스케일링 및 (십진수의 경우) 양자화[25][26]
- 부호 복사 및 조작(절댓값, 부정 등)[27]
- 비교 및 전순서[28][29]
- 숫자의 분류(비정규, 유한 등) 및 NaN 테스트[30]
- 상태 플래그 테스트 및 설정[31]
비교 판단
이 표준은 지원되는 산술 형식에서 하나의 부동소수점 데이터를 다른 데이터와 비교하기 위한 비교 판단을 제공한다.[32] NaN과의 모든 비교는 순서가 지정되지 않은 것으로 처리된다. −0과 +0은 동일하게 비교된다.
전순서 판단
이 표준은 지원되는 산술 형식의 표준 멤버에 대한 전순서를 정의하는 `totalOrder` 판단을 제공한다.[33] 이 판단은 한 부동소수점 숫자가 다른 숫자보다 작을 때 비교 판단(섹션 비교 판단 참조)과 일치한다. 주요 차이점은 다음과 같다.[34]
- NaN은 정렬 가능하다.
- NaN은 무한대(또는 다른 부동소수점 숫자)보다 큰 절댓값을 가진 것처럼 취급된다. (−NaN < −Infinity; +Infinity < +NaN.)
- qNaN과 sNaN은 qNaN이 sNaN보다 큰 절댓값을 가진 것처럼 취급된다. (−qNaN < −sNaN; +sNaN < +qNaN.)
- NaN은 페이로드에 따라 정렬된다. IEEE 754-2008에서는 더 작은 페이로드를 가진 NaN이 더 작은 절댓값을 가진 것으로 취급된다. IEEE 754-2019에서는 구현 정의된 모든 순서가 허용된다.
- 음의 0은 양의 0보다 작은 것으로 취급된다.
- 비교의 양쪽이 동일한 부동소수점 데이터를 참조하는 경우, 지수가 더 작은 쪽이 더 작은 절댓값을 가진 것으로 취급된다.[33]
`totalOrder` 판단은 형식의 모든 인코딩에 전순서를 부과하지 않는다. 특히, 동일한 부동소수점 표현의 다른 인코딩(예: 하나 또는 둘 다의 인코딩이 비표준인 경우)을 구별하지 않는다.[33] IEEE 754-2019는 `totalOrder`에 대한 명확화를 포함한다.
NaN 신호 비트의 배치에 대한 IEEE 754-2008 권장 사항을 따르는 이진 교환 형식의 경우, 비교는 부동소수점 숫자를 부호-크기 정수(타입 재해석 가정, 이 비교와 일치하는 페이로드 순서 가정)로 타입 재해석하는 것과 동일하며, 이는 FPU 없이 FP 비교를 위한 오래된 기술이다.[35]
Remove ads
예외 처리
이 표준은 다섯 가지 예외를 정의하며, 각 예외는 기본값을 반환하고 예외 발생 시 설정되는 해당 상태 플래그를 가진다.[g] 다른 예외 처리는 필요하지 않지만, 추가적인 비기본 대안이 권장된다(섹션 대체 예외 처리 참조).
다섯 가지 가능한 예외는 다음과 같다.
- 잘못된 연산: 수학적으로 정의되지 않음, 예: 음수의 제곱근. 기본적으로 qNaN을 반환한다.
- 0으로 나누기: 유한 피연산자에 대한 연산이 정확한 무한 결과를 생성함, 예: 1/0 또는 log(0). 기본적으로 ±무한대를 반환한다.
- 오버플로: 유한 결과가 너무 커서 정확하게 표현할 수 없음(즉, 무제한 지수 범위에서 지수가 emax보다 클 수 있음). 기본적으로 가장 가까운 반올림 모드에서는 ±무한대를 반환한다(그리고 방향성 반올림 모드에서는 반올림 규칙을 따른다).
- 언더플로: 결과가 매우 작음(정규 범위를 벗어남). 기본적으로 크기가 최소 양수 정규 숫자보다 작거나 같은 숫자를 반환한다(반올림 규칙을 따름). 비정규 값은 항상 언더플로 예외를 의미하지만, 기본적으로 정확한 경우 플래그가 설정되지 않는다.
- 부정확: 정확한(즉, 반올림되지 않은) 결과가 정확하게 표현될 수 없음. 기본적으로 올바르게 반올림된 결과를 반환한다.
이는 IEEE 754-1985에서 정의된 것과 동일한 다섯 가지 예외이지만, 0으로 나누기 예외는 나눗셈 외의 연산으로 확장되었다.
일부 십진 부동소수점 구현은 IEEE 754에 포함되지 않은 추가 예외를 정의한다.[36][37]
- 제한됨(Clamped): 결과의 지수가 대상 형식에 비해 너무 큼. 기본적으로 후행 0이 계수에 추가되어 지수를 가장 큰 사용 가능한 값으로 줄인다. 이것이 불가능할 경우(필요한 자릿수가 대상 형식보다 많아지는 경우) 오버플로 예외가 발생한다.
- 반올림됨(Rounded): 결과의 계수가 대상 형식이 제공하는 것보다 더 많은 자릿수를 필요로 함. 0이 아닌 자릿수가 버려질 경우 부정확 예외가 신호된다.
또한, quantize와 같은 연산에서 피연산자 중 하나가 무한대이거나 결과가 대상 형식에 맞지 않으면 잘못된 연산 예외도 신호한다.[38]
Remove ads
특수 값
요약
관점
부호 있는 0
IEEE 754 표준에서는 0에 부호가 있으며, 이는 "양의 0"(+0)과 "음의 0"(-0)이 모두 존재함을 의미한다. 대부분의 런타임 환경에서 양의 0은 일반적으로 "0
"으로, 음의 0은 "-0
"으로 출력된다. 두 값은 숫자 비교에서 동일하게 동작하지만, 일부 연산은 +0과 -0에 대해 다른 결과를 반환한다. 예를 들어, 1/(−0)은 음의 무한대를 반환하는 반면, 1/(+0)은 양의 무한대를 반환한다(따라서 1/(1/±∞) = ±∞ 항등식이 유지됨). x = 0에서 불연속 함수이며 +0과 -0을 다르게 처리할 수 있는 다른 일반적인 함수에는 Γ(x)와 임의의 음수 y에 대한 y + xi의 주요 제곱근이 포함된다. 다른 근사 방식과 마찬가지로 "음의 0"과 관련된 연산은 때때로 혼란을 야기할 수 있다. 예를 들어, IEEE 754에서 는 항상 1/x = 1/y를 의미하지 않는데, 0 = −0이지만 1/0 ≠ 1/(−0)이기 때문이다.[39] 또한, ±0의 역 제곱근[h]은 ±∞인 반면, 실수 상에서 수학 함수 는 음수 값을 가지지 않는다.
비정규 값
비정규 값은 언더플로 간격을, 언더플로 간격 바로 바깥의 인접 값들과 동일한 절대 거리 값을 가진 값들로 채운다. 이는 언더플로 간격에 0만 두고 언더플로 결과가 0으로 대체되던(flush to zero) 이전 관행보다 개선된 것이다.[40]
최신 부동소수점 하드웨어는 일반적으로 비정규 값(정규 값뿐만 아니라)을 처리하며, 비정규 값에 대한 소프트웨어 에뮬레이션이 필요하지 않다.
무한대
확장된 실수의 무한대는 1, 1.5 등과 같은 일반적인 부동소수점 값처럼 IEEE 부동소수점 데이터 형식으로 표현될 수 있다. 이는 어떤 식으로든 오류 값은 아니지만, 오버플로가 발생할 때 종종(반올림에 따라 다름) 대체 값으로 사용된다. 0으로 나누기 예외 발생 시, 양의 또는 음의 무한대가 정확한 결과로 반환된다. 무한대는 숫자(C의 "INFINITY" 매크로 또는 프로그래밍 언어가 해당 구문을 허용하는 경우 "∞")로도 도입될 수 있다.
IEEE 754는 무한대를 합리적인 방식으로 처리하도록 요구한다. 예를 들면 다음과 같다.
- (+∞) + (+7) = (+∞)
- (+∞) × (−2) = (−∞)
- (+∞) × 0 = NaN – 의미 있는 작업이 없다.
NaN
IEEE 754는 0/0, ∞×0, sqrt(−1)과 같은 특정 "잘못된" 연산의 결과로 반환되는 "숫자가 아님"(NaN)이라는 특수 값을 지정한다. 일반적으로 NaN은 전파된다. 즉, NaN을 포함하는 대부분의 연산은 NaN을 결과로 내지만, 주어진 부동소수점 값에 대해 정의된 결과를 제공하는 함수는 NaN에 대해서도 그렇게 한다(예: NaN ^ 0 = 1). NaN에는 두 가지 종류가 있다: 기본적으로 조용한 NaN(quiet NaN)과 선택적으로 신호 NaN(signaling NaN). 모든 산술 연산(숫자 비교 포함)에서 신호 NaN은 "잘못된 연산" 예외를 알린다.
표준에 의해 지정된 NaN의 표현은 오류의 유형 또는 소스를 인코딩하는 데 사용될 수 있는 일부 지정되지 않은 비트를 가지고 있다. 그러나 해당 인코딩에 대한 표준은 없다. 이론적으로 신호 NaN은 런타임 시스템에서 초기화되지 않은 변수를 플래그하거나, 일반 값으로 계산 속도를 늦추지 않고 부동소수점 숫자를 다른 특수 값으로 확장하는 데 사용될 수 있지만, 이러한 확장은 일반적이지 않다.
Remove ads
설계 배경
요약
관점

여기서 논의된 확장 형식, NaN, 무한대, 비정규 값 등 IEEE 754 표준의 좀 더 난해한 기능들이 수치 해석학자나 고급 수치 응용 프로그램에만 관심 있는 것이라는 일반적인 오해가 있다. 사실은 그 반대이다. 이러한 기능들은 전문가를 위한 정교한 수치 라이브러리를 지원하는 것 외에도 수치적으로 미숙한 프로그래머에게 안전하고 견고한 기본값을 제공하도록 설계되었다. IEEE 754의 핵심 설계자인 윌리엄 카한은 다음과 같이 언급한다. "IEEE 754 이진 부동소수점 연산 표준의 기능들이 수치 전문가 외에는 아무도 사용할 수 없는 기능으로 [간주되는 것]은 잘못이다. 사실은 정반대이다. 1977년에 이 기능들은 가장 넓은 시장에 서비스하기 위해 인텔 8087에 설계되었다... 오류 분석은 프로그래머들 사이의 선의의 무지에 대해 적당히 관대한 IEEE 754 표준과 같은 부동소수점 연산을 설계하는 방법을 알려준다."[41]
- 무한대, NaN과 같은 특수 값은 부동소수점 연산이 대수적으로 완전하도록 보장한다. 즉, 모든 부동소수점 연산은 잘 정의된 결과를 생성하며, 기본적으로 기계 인터럽트나 트랩을 발생시키지 않는다. 또한, 예외적인 경우에 반환되는 특수 값의 선택은 많은 경우에 올바른 답을 제공하도록 설계되었다. 예를 들어, IEEE 754 연산에서는
R(z) := 7 − 3/[z − 2 − 1/(z − 7 + 10/[z − 2 − 2/(z − 3)])]
와 같은 연분수는 모든 입력에 대해 올바른 답을 제공한다. 이는 잠재적인 0으로 나누기, 예를 들어 z = 3의 경우 +무한대를 제공하여 올바르게 처리되며, 따라서 이러한 예외는 안전하게 무시될 수 있기 때문이다.[42] 카한이 언급했듯이, 아리안 5호 로켓의 손실을 초래한 부동소수점의 16비트 정수 변환 오버플로로 인한 처리되지 않은 트랩은 기본 IEEE 754 부동소수점 정책 하에서는 발생하지 않았을 것이다.[41] - 비정규 값은 유한 부동소수점 숫자 x와 y에 대해 x − y = 0이 x = y인 경우에만 성립하도록 보장하며, 이는 예상되는 결과이지만 이전 부동소수점 표현에서는 그렇지 않았다.[43]
- x87 80비트 형식의 설계 배경에 대해 카한은 다음과 같이 언급했다. "이 확장 형식은 속도 손실이 거의 없이 float 및 double 피연산자를 사용하는 가장 간단한 산술을 제외한 모든 산술에 사용하도록 설계되었다. 예를 들어, 다항식 평가, 스칼라 곱, 부분 및 연분수와 같은 재귀를 구현하는 루프의 스크래치 변수에 사용되어야 한다. 이는 종종 단순한 알고리즘을 망칠 수 있는 조기 오버/언더플로 또는 심각한 국소 소거를 방지한다."[44] 높은 정밀도와 확장된 지수를 가진 확장 형식으로 중간 결과를 계산하는 것은 과학적 계산의 역사적 관행과 공학용 계산기 설계에 선례가 있다. 예를 들어, 휴렛 팩커드의 금융 계산기는 저장하거나 표시하는 것보다 세 자릿수 더 높은 정밀도로 산술 및 금융 함수를 수행했다.[44] 확장 정밀도 구현을 통해 표준 기본 함수 라이브러리를 쉽게 개발할 수 있었으며, 이는 일반적으로 높은 속도로 마지막 자릿수 단위 (ULP) 내에서 이중 정밀도 결과를 제공했다.
- 값을 가장 가까운 표현 가능한 값으로 정확히 반올림하면 계산에서 체계적인 편향을 피하고 오류 증가를 늦춘다. 같은 숫자를 더할 때 발생할 수 있는 통계적 편향을 제거한다.
- 방향성 반올림은 예를 들어 구간 산술에서 오류 경계를 확인하는 데 도움이 되도록 의도되었다. 또한 일부 함수의 구현에도 사용된다.
- 연산의 수학적 기초, 특히 정확한 반올림은 수학적 속성을 증명하고 2Sum, Fast2Sum 및 Kahan summation algorithm과 같은 부동소수점 알고리즘을 설계하는 것을 가능하게 한다. 예를 들어, 정확도를 향상시키거나 다중 정밀도 산술 서브루틴을 비교적 쉽게 구현할 수 있다.
단정밀도 및 배정밀도 형식의 특징은 부동소수점 하드웨어를 사용하지 않고도 비트가 부호-크기 정수를 나타내는 것처럼 쉽게 정렬할 수 있다는 것이다. 비록 이것이 설계 고려 사항이었는지는 불분명하지만(이전의 IBM 16진 부동소수점 표현도 정규화된 숫자에 대해 이러한 속성을 가졌다는 점은 주목할 만하다). 널리 사용되는 2의 보수 표현에서, 비트를 부호 있는 정수로 타입 재해석하면 양수는 올바르게 정렬되지만, 음수는 역순으로 정렬된다. 이를 수정하는 한 가지 방법으로, 양수 값에 대해 부호 비트를 뒤집고 음수 값에 대해 모든 비트를 뒤집는 XOR 연산을 사용하면 모든 값이 부호 없는 정수로 정렬될 수 있다(−0 < +0).[35]
Remove ads
권장 사항
요약
관점
대체 예외 처리
이 표준은 사용자 정의 기본값 사전 대체, 트랩(흐름을 어떤 식으로든 변경하는 예외) 및 try/catch와 같이 흐름을 중단하는 기타 예외 처리 모델을 포함하여 다양한 형태의 선택적 예외 처리를 권장한다. 트랩 및 기타 예외 메커니즘은 IEEE 754-1985와 마찬가지로 선택 사항으로 유지된다.
권장 연산
이 표준의 9절은 언어 표준이 정의해야 할 추가 수학 연산을 권장한다.[45] 표준을 준수하기 위해 필수로 요구되는 연산은 없다.
다음은 정확하게 반올림되어야 하는 권장 산술 연산이다.[46]
- , ,
- , ,
- , ,
- , ,
- for (기하급수적 성장을 계산하는 데 사용되며, 그 비율은 −1보다 작을 수 없다)[47]
- ,
- , ,
- , , ,
- , , (참고: 원주율의 배수)
- , , , (참고: 원주율의 배수)
- , ,
- , ,
, 및 함수는 덜 필요하다고 간주되어 IEEE 754-2008 표준의 일부가 아니었다.[48] 와 는 언급되었지만 이는 오류로 간주되었다.[5] 이 세 함수는 모두 2019년 개정판에 추가되었다.
권장되는 연산에는 동적 모드 반올림 방향 설정 및 접근[49]과 합계, 스케일링된 곱, 스칼라곱과 같이 정확도가 표준에 의해 지정되지 않은 구현 정의 벡터 축소 연산이 포함된다.[50]
2019년 기준[update] 현재 이진 형식에 대한 확장 산술 연산[51]도 권장된다. 덧셈, 뺄셈, 곱셈에 대해 지정된 이 연산은 형식에서 가장 가까운 값으로 정확하게 반올림된 결과와 형식에서 정확하게 표현 가능한 오차 항으로 구성된 한 쌍의 값을 생성한다. 표준 발행 당시에는 하드웨어 구현이 알려지지 않았지만, 매우 유사한 연산은 이미 잘 알려진 알고리즘을 사용하여 소프트웨어로 구현되었다. 이들의 표준화 역사와 동기는 배경 문서에 설명되어 있다.[52][53]
2019년 현재, IEEE 754-2008의 minNum, maxNum, minNumMag, maxNumMag은 비연관성으로 인해 구식화되었다. 대신 두 가지 새로운 최소 및 최대 연산 집합이 권장된다.[54] 첫 번째 집합은 최소(minimum), 최소 숫자(minimumNumber), 최대(maximum), 최대 숫자(maximumNumber)를 포함한다. 두 번째 집합은 최소 크기(minimumMagnitude), 최소 크기 숫자(minimumMagnitudeNumber), 최대 크기(maximumMagnitude), 최대 크기 숫자(maximumMagnitudeNumber)를 포함한다. 이 변경의 역사와 동기는 배경 문서에 설명되어 있다.[55]
표현식 평가
이 표준은 언어 표준이 연산 시퀀스의 의미론을 지정해야 하는 방법과 결과 값의 변경을 가져오는 리터럴 의미와 최적화의 미묘함을 지적한다. 대조적으로, 이전 1985 버전의 표준은 언어 인터페이스의 측면을 지정하지 않아 컴파일러 간의 일관되지 않은 동작이나 최적화 컴파일러의 다른 최적화 수준으로 이어졌다.
프로그래밍 언어는 사용자가 각 기수에 대한 표현식의 중간 계산에 대한 최소 정밀도를 지정할 수 있도록 허용해야 한다. 이는 표준에서 preferredWidth라고 불리며, 블록별로 설정할 수 있어야 한다. 표현식 내의 중간 계산은 피연산자의 너비와 설정된 경우 선호 너비 중 최대값을 사용하여 계산되고 임시 변수가 저장되어야 한다. 따라서 예를 들어 X87 부동소수점 하드웨어를 대상으로 하는 컴파일러는 중간 계산이 double-extended format을 사용해야 함을 지정하는 수단을 가져야 한다. 변수의 저장된 값은 후속 표현식을 평가할 때 항상 사용되어야 하며, 변수에 반올림 및 할당하기 전의 어떤 전임자도 사용되어서는 안 된다.
재현성
IEEE 754-1985 버전의 표준은 구현에서 많은 변형(일부 값의 인코딩 및 특정 예외의 감지 등)을 허용했다. IEEE 754-2008은 이러한 허용을 줄였지만, 몇 가지 변형은 여전히 남아 있다(특히 이진 형식의 경우). 재현성 절은 언어 표준이 재현 가능한 프로그램(즉, 언어의 모든 구현에서 동일한 결과를 생성하는 프로그램)을 작성하는 수단을 제공해야 한다고 권장하며, 재현 가능한 결과를 달성하기 위해 수행해야 할 작업을 설명한다.
잠재적으로 재현 불가능한 동작의 구체적인 예는 C 및 C++에서 찾을 수 있다. 이 언어들은 부동소수점 연산 결과에 대해 더 높은 정밀도를 사용하고, 일반적인 곱셈-덧셈을 FMA로, `1.0/sqrt(x)`를 단일 명령어로 역 제곱근으로 축약하는 것을 허용한다.[56] GCC 및 cl.exe와 같은 C/C++ 컴파일러는 이러한 변경 사항이 명확한 정확도 손실 없이 더 빠른 코드를 생성할 수 있으므로, 특별히 요청하지 않는 한 기본적으로 둘 다 허용한다. 컴파일러는 또한 더 명백하게 비준수적인 "빠른" 최적화를 제공한다.[57][58] C 수식 함수는 일반적으로 "정확하게 반올림"되도록 구현되지 않아 문제를 더한다.[59] 부동소수점 환경도 서드파티 코드에 의해 예상치 않게 변경될 수 있다.
Remove ads
문자 표현
요약
관점
이 표준은 기본 형식과 외부 문자열 형식 간의 변환 연산을 요구한다.[60] 십진 문자 형식으로의 변환과 그 반대로의 변환은 모든 형식에 대해 필수이다. 외부 문자열 형식으로의 변환은 가장 가까운 짝수로 반올림하여 다시 변환할 때 원래 숫자를 복구할 수 있어야 한다. 조용한 NaN 또는 신호 NaN의 페이로드를 보존할 필요는 없으며, 외부 문자열 형식에서 변환할 때 신호 NaN이 조용한 NaN으로 바뀔 수 있다.
원래 이진 값은 다음을 사용하여 십진수로 변환한 다음 다시 변환하여 보존된다.[61]
- binary16의 경우 5자리 십진수,
- binary32의 경우 9자리 십진수,
- binary64의 경우 17자리 십진수,
- binary128의 경우 36자리 십진수.
다른 이진 형식의 경우 필요한 십진수 자릿수는 다음과 같다.[i]
여기서 p는 이진 형식의 유효 비트 수이며, 예를 들어 binary256의 경우 237비트이다.
십진 부동소수점 형식을 사용할 때 십진 표현은 다음을 사용하여 보존된다.
- decimal32의 경우 7자리 십진수,
- decimal64의 경우 16자리 십진수,
- decimal128의 경우 34자리 십진수.
이진수에서 십진수로, 십진수에서 이진수로 정확하게 반올림되는 변환을 위한 알고리즘과 코드는 게이(Gay)가 논의했고,[62] 테스트 – 는 팩슨(Paxson)과 카한(Kahan)이 논의했다.[63]
16진수 리터럴
이 표준은 C99의 16진수 부동소수점 리터럴을 기반으로 하는 외부 16진수-유효숫자 문자 시퀀스와의 변환을 권장한다. 이러한 리터럴은 선택적 부호(`+` 또는 `-`), "0x" 지시자, 소수점 유무에 관계없이 16진수, "p" 지수 지시자, 선택적 부호가 있는 십진 지수로 구성된다. 구문은 대소문자를 구분하지 않는다.[64] 십진 지수는 2의 거듭제곱으로 스케일링된다. 예를 들어, `0x0.1p0`은 1/16이고 `0x0.1p-4`는 1/256이다.[65]
같이 보기
- bfloat16 부동소수점 형식
- Binade
- 코프로세서
- C99 (IEEE 754 기능에 대한 접근 및 사용을 보여주는 코드 예제 포함)
- 부동소수점, (IEEE 754 기능의 역사, 설계 배경 및 사용 예시)
- 고정소수점, (유리수 계산에 대한 대안적 접근 방식, 특히 지수 범위가 알려져 있거나 고정되어 있거나 컴파일 시간에 바인딩될 때 유용)
- IBM System z9, (하드웨어 마이크로코드를 사용하여 IEEE 754-2008 십진수 산술을 구현한 최초의 CPU)
- IBM z10, IBM z196, IBM zEC12, 및 IBM z13, (하드웨어에서 IEEE 754-2008 십진수 산술을 완전히 구현하는 CPU)
- ISO/IEC 10967, 언어 독립 산술(LIA)
- Minifloat, IEEE 754 원칙을 따르는 저정밀도 이진 부동소수점 형식
- POWER6, POWER7, 및 POWER8 CPU (하드웨어에서 IEEE 754-2008 십진수 산술을 완전히 구현하는 CPU)
- strictfp, 이전에 자바 프로그래밍 언어에서 일반적인 하드웨어 플랫폼 간의 재현성을 보장하기 위해 산술을 IEEE 754 단일 및 이중 정밀도로 제한했던 구식 키워드 (자바 17부터 이 동작이 필수가 됨)
- Table-maker's dilemma (함수의 정확한 반올림에 대한 추가 정보)
- Standard Apple Numerics Environment
- Tapered floating point
- Posit, 대체 숫자 형식
Remove ads
각주
- 고속 역 제곱근 및 Methods of computing square roots#Iterative methods for reciprocal square roots 참조
Remove ads
참고 문헌
더 읽어보기
외부 링크
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads