부동 소수점 규칙(Direct3D 10)
Direct3D 10은 여러 다른 부동 소수점 표현을 지원합니다. 모든 부동 소수점 계산은 IEEE 754 32비트 단정밀도 부동 소수점 동작의 정의된 하위 집합에서 작동합니다.
-
32비트 Floating-Point 규칙
- IEEE-754 규칙
- IEEE-754 규칙 편차 또는 추가 요구 사항
- 16비트 Floating-Point 규칙
- 11비트 및 10비트 Floating-Point 규칙
- 관련 항목
32비트 Floating-Point 규칙
IEEE-754를 준수하는 규칙과 표준에서 벗어나는 규칙의 두 집합이 있습니다.
IEEE-754 규칙 준수
이러한 규칙 중 일부는 IEEE-754에서 선택할 수 있는 단일 옵션입니다.
- 0으로 나누면 0/0을 제외하고 +/- INF가 생성되어 NaN이 생성됩니다.
- (+/-) 0의 로그는 -INF를 생성합니다. 음수 값(-0이외의)의 로그는 NaN을 생성합니다.
- 음수의 역 제곱근(rsq) 또는 제곱근(sqrt)은 NaN을 생성합니다. 예외는 -0입니다. sqrt(-0)는 -0을 생성하고 rsq(-0)는 -INF를 생성합니다.
- INF - INF = NaN
- (+/-)INF / (+/-)INF = NaN
- (+/-)INF * 0 = NaN
- NaN(모든 OP) any-value = NaN
- 비교 EQ, GT, GE, LT 및 LE, 두 피연산자 중 하나 또는 둘 다 NaN이면 FALSE 반환됩니다.
- 비교는 0의 부호를 무시합니다(따라서 +0은 -0같음).
- 비교 NE입니다. 두 피연산자 중 하나 또는 둘 다 NaN이면 TRUE 반환됩니다.
- NaN이 아닌 값을 +/- INF와 비교하면 올바른 결과가 반환됩니다.
IEEE-754 규칙의 편차 또는 추가 요구 사항
- IEEE-754를 사용하려면 부동 소수점 연산을 통해 무한정 정확한 결과(가장 가까운 짝수로 알려진)에 가장 가까운 표현 가능한 값을 생성해야 합니다. 그러나 Direct3D 10은 더 느슨한 요구 사항을 정의합니다. 32비트 부동 소수점 연산은 무한정 정확한 결과의 1개의 ULP(단위 마지막 위치) 내에 있는 결과를 생성합니다. 예를 들어 하드웨어는 최대 하나의 ULP 오류가 발생하므로 가장 가까운 짝수로 반올림을 수행하는 대신 결과를 32비트로 잘라 내도록 허용됩니다.
- 부동 소수점 예외, 상태 비트 또는 트랩은 지원되지 않습니다.
- 부동 소수점 수학 연산의 입력 및 출력에 대해 비정규가 부호로 보존된 0으로 플러시됩니다. 데이터를 조작하지 않는 I/O 또는 데이터 이동 작업에 대해 예외가 발생합니다.
- Viewport MinDepth/MaxDepth, BorderColor 값 등과 같은 부동 소수점 값이 포함된 상태는 비정상 값으로 제공될 수 있으며 하드웨어에서 사용하기 전에 플러시될 수도 있고 그렇지 않을 수도 있습니다.
- 최소 또는 최대 연산은 비교를 위해 비정규를 플러시하지만 결과는 비정상 플러시되거나 플러시되지 않을 수 있습니다.
- 작업에 대한 NaN 입력은 항상 출력에서 NaN을 생성합니다. 그러나 NaN의 정확한 비트 패턴은 동일하게 유지되지 않아도 됩니다(작업이 원시 이동 명령이 아니면 데이터를 전혀 변경하지 않습니다.)
- 한 피연산자만 NaN인 최소 또는 최대 연산은 다른 피연산자를 결과로 반환합니다(위의 비교 규칙과 반대). Direct3D 10에 필요한 새 IEEE 규칙(IEEE 754R)입니다.
- 또 다른 새로운 IEEE 754R 규칙은 부호 있는 0에 대한 비교 규칙과 달리 min(-0,+0) == min(+0,-0) == -0 및 max(-0,+0) == max(+0,-0) == +0입니다. Direct3D 10은 여기서 IEEE 754R 동작을 권장하지만 적용되지는 않습니다. 기호를 무시하는 비교를 사용하여 매개 변수 순서에 따라 0을 비교한 결과가 허용됩니다.
- x*1.0f는 항상 x(비정상 플러시 제외)로 발생합니다.
- x/1.0f는 항상 x(비정상 플러시 제외)로 발생합니다.
- x +/- 0.0f는 항상 x로 발생합니다(denorm flushed 제외). 그러나 -0 + 0 = +0입니다.
- 융합 연산(예: mad, dp3)은 연산의 융합되지 않은 확장에 대한 평가의 최악의 직렬 순서보다 정확도가 낮은 결과를 생성합니다. 허용 오차를 위해 가능한 최악의 순서 지정 정의는 지정된 융합 작업에 대한 고정된 정의가 아닙니다. 입력의 특정 값에 따라 달라집니다. 융합되지 않은 확장의 개별 단계는 각각 1개의 ULP 허용 오차(또는 Direct3D 10이 1 ULP보다 더 느슨한 허용 오차로 호출되는 경우, 더 느슨한 허용 오차가 허용됨)입니다.
- 융합 연산은 융합이 아닌 작업과 동일한 NaN 규칙을 준수합니다.
- 곱하고 나누기 각각은 32비트 부동 소수점 정밀도 수준(정확도 1 ULP)에서 작동합니다.
16비트 Floating-Point 규칙
Direct3D 10은 부동 소수점 숫자의 16비트 표현도 지원합니다.
판:
- MSB 비트 위치에 있는 1개 부호 비트
- 편향된 지수 5비트(e)
- 추가 숨겨진 비트가 있는 10비트 분수(f)
float16 값(v)은 다음 규칙을 따릅니다.
- e == 31 및 f != 0이면 v는 s에 관계없이 NaN입니다.
- e == 31 및 f == 0이면 v = (-1)s*무한대(부호 있는 무한대)
- e가 0에서 31 사이이면 v = (-1)s*2(e-15)*(1.f)
- e == 0 및 f != 0이면 v = (-1)s*2(e-14)*(0.f)(비정규화된 숫자)
- e == 0 및 f == 0이면 v = (-1)s*0(부호 있는 0)입니다.
32비트 부동 소수점 규칙은 위에서 설명한 비트 레이아웃에 맞게 조정된 16비트 부동 소수점 숫자도 유지합니다. 이에 대한 예외는 다음과 같습니다.
- 정밀도: 16비트 부동 소수점 숫자의 융합되지 않은 연산은 무한정 정확한 결과에 가장 가까운 표현 가능한 값을 생성합니다(IEEE-754당 가장 가까운 짝수로 반올림, 16비트 값에 적용됨). 32비트 부동 소수점 규칙은 1개의 ULP 허용 오차를 준수하고, 16비트 부동 소수점 규칙은 융합되지 않은 작업의 경우 0.5 ULP, 융합 작업에는 0.6 ULP를 준수합니다.
- 16비트 부동 소수점 숫자는 비정상 값을 유지합니다.
11비트 및 10비트 Floating-Point 규칙
Direct3D 10은 11비트 및 10비트 부동 소수점 형식도 지원합니다.
판:
- 부호 없는 비트
- 편향된 지수 5비트(e)
- 11비트 형식의 경우 6비트(f)이고, 10비트 형식의 경우 5비트 분수(f)입니다. 두 경우 모두 숨겨진 비트가 추가로 있습니다.
float11/float10 값(v)은 다음 규칙을 따릅니다.
- e == 31 및 f != 0이면 v는 NaN입니다.
- e == 31 및 f == 0이면 v = +infinity
- e가 0에서 31 사이이면 v = 2(e-15)*(1.f)
- e == 0 및 f != 0이면 v = *2(e-14)*(0.f)(비정규화된 숫자)
- e == 0 및 f == 0이면 v = 0(0)입니다.
32비트 부동 소수점 규칙은 위에서 설명한 비트 레이아웃에 맞게 조정된 11비트 및 10비트 부동 소수점 숫자도 유지합니다. 예외는 다음과 같습니다.
- 정밀도: 32비트 부동 소수점 규칙은 0.5 ULP를 준수합니다.
- 10/11비트 부동 소수점 숫자는 비정상 값을 유지합니다.
- 숫자가 0보다 작은 모든 연산은 0으로 고정됩니다.
관련 항목