부동 소수점 규칙(Direct3D 10)

Direct3D 10은 여러 다른 부동 소수점 표현을 지원합니다. 모든 부동 소수점 계산은 IEEE 754 32비트 단일 정밀도 부동 소수점 동작의 정의된 하위 집합에서 작동합니다.

32비트 Floating-Point 규칙

두 가지 규칙 집합이 있습니다. IEEE-754를 준수하는 것과 표준에서 벗어난 것입니다.

IEEE-754 규칙 적용

이러한 규칙의 일부는 IEEE-754에서 제공하는 유일한 선택 항목입니다.

  • 0으로 나누면 +/-INF가 됩니다. NaN이 되는 0/0은 예외입니다.
  • (+/-)0의 로그 값은 -INF입니다. 음수 값(-0 제외)의 로그 값은 NaN입니다.
  • 음수의 역수 제곱근(rsq) 또는 제곱근(sqrt)은 NaN이 됩니다. 예외는 -0입니다. sqrt(-0)은 -0이며 rsq(-0)은 -INF가 됩니다.
  • INF - INF = NaN
  • (+/-)INF / (+/-)INF = NaN
  • (+/-)INF * 0 = NaN
  • NaN (모든 연산자) 모든 값 = NaN
  • 한 피연산자 또는 두 피연산자가 NaN일 경우 EQ, GT, GE, LT, LE 비교는 FALSE를 반환합니다.
  • 비교는 0의 부호를 무시합니다. 따라서 +0은 -0과 같습니다.
  • 한 피연산자 또는 두 피연산자가 NaN일 경우 NE 비교는 TRUE를 반환합니다.
  • NaN이 아닌 모든 값을 +/-INF와 비교하면 올바른 결과를 반환합니다.

IEEE-754 규칙의 편차 또는 추가 요구 사항

  • IEEE-754에서는 부동 소수점 연산이 표현할 수 있는 가장 근접한 값을 무한한 정확도의 결과로 생성되도록 요구합니다. 이를 가장 가까운 짝수로 반올림이라고 합니다. 그러나 Direct3D 10은 더 느슨한 요구 사항을 정의합니다. 32비트 부동 소수점 연산은 무한정 정확한 결과의 1개의 ULP(단가) 내에 있는 결과를 생성합니다. 즉, 예를 들어 하드웨어가 가장 가까운 짝수로 반올림 대신 결과를 32비트로 자르도록 허용하면 오류가 최대 1 ULP의 범위 내에서만 발생하게 됩니다.
  • 부동 소수점 예외, 상태 비트 또는 트랩은 지원되지 않습니다.
  • 비정규화 값은 모든 부동 소수점 수학 연산의 입력과 출력에서 부호가 유지된 0으로 플러시됩니다. 데이터를 조작하지 않는 I/O 또는 데이터 이동 작업에 대해 예외가 발생합니다.
  • 뷰포트 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입니다(비정규화 값이 플러시되는 경우는 제외). 하지만 -0 + 0 = +0입니다.
  • 혼합 연산(예: mad, dp3)은 연산의 비혼합 확장이 가질 수 있는 가장 최악의 직렬 배열보다는 정확한 결과를 생성합니다. 허용 오차를 위해 가능한 최악의 순서 정의는 지정된 융합 연산에 대한 고정된 정의가 아닙니다. 입력의 특정 값에 따라 달라집니다. 융합되지 않은 확장의 개별 단계는 각각 1개의 ULP 허용 오차를 허용합니다(또는 Direct3D 10이 1 ULP보다 더 느슨한 허용 오차로 호출하는 모든 지침의 경우 더 느슨한 허용 오차가 허용됨).
  • 혼합 연산은 비혼합 연산과 동일한 NaN 규칙을 따릅니다.
  • 곱하고 나누기 각각은 32비트 부동 소수점 정밀도 수준에서 작동합니다(정확도는 1 ULP).

16비트 Floating-Point 규칙

Direct3D 10은 부동 소수점 숫자의 16비트 표현도 지원합니다.

형식:

  • MSB 비트 위치에서 1개의 부호 비트(s)
  • 편향 지수의 5비트(e)
  • 숨겨진 추가 비트를 가진 분수의 10비트(f)

float16 값(v)은 다음 규칙을 따릅니다.

  • e == 31이고 f != 0인 경우 s와 관계없이 v는 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비트, 10비트 형식의 경우 분수의 5비트(양쪽 모두 숨겨진 추가 비트 포함)

float11/float10 값(v)은 다음 규칙을 따릅니다.

  • if e == 31 and f != 0, then v is NaN
  • e == 31이고 f == 0이면 v = +무한입니다.
  • 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입니다.

32비트 부동 소수점 규칙은 위에서 설명한 비트 레이아웃에 맞게 조정된 11비트 및 10비트 부동 소수점 숫자에도 유지됩니다. 다음과 같은 예외가 있습니다.

  • 정밀도: 32비트 부동 소수점 규칙은 0.5 ULP를 따릅니다.
  • 10/11비트 부동 소수점 숫자는 비정규화 값을 유지합니다.
  • 숫자가 0보다 작은 모든 연산은 0으로 고정됩니다.

리소스(Direct3D 10)