다음을 통해 공유


부동 소수점 규칙(Direct3D 11)

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

32비트 부동 소수점 규칙

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(임의의 연산자) 임의의 값 = NaN
  • 비교 EQ, GT, GE, LT 및 LE에서 두 피연산자 중 하나 또는 둘 다 NaN이면 FALSE반환한다.
  • 비교는 0의 부호를 무시합니다(따라서 +0은 -0같음).
  • 비교 NE에서, 두 피연산자 중 하나 또는 둘 다 NaN일 경우 TRUE를 반환합니다.
  • NaN이 아닌 값을 +/- INF와 비교하면 올바른 결과가 반환됩니다.

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

  • IEEE-754를 사용하려면 부동 소수점 연산을 통해 무한정 정확한 결과(가장 가까운 짝수로 알려진)에 가장 가까운 표현 가능한 값을 생성해야 합니다. Direct3D 11은 동일한 요구 사항을 정의합니다. 32비트 부동 소수점 연산은 무한정 정확한 결과의 0.5 단위 마지막 위치(ULP) 내에 있는 결과를 생성합니다. 예를 들어 하드웨어는 0.5 ULP의 오류가 발생하므로 가장 가까운 짝수로 반올림을 수행하는 대신 결과를 32비트로 자르도록 허용됩니다. 이 규칙은 더하기, 빼기 및 곱하기만 적용됩니다.

  • 부동 소수점 예외, 상태 비트 또는 트랩은 지원되지 않습니다.

  • 부동 소수점 수학 연산의 입력과 출력에서 비정규 숫자는 부호를 유지한 상태로 0으로 변환됩니다. 데이터를 조작하지 않는 I/O 또는 데이터 이동 작업에 대해 예외가 발생합니다.

  • Viewport MinDepth/MaxDepth, BorderColor 값과 같은 부동 소수점 값이 포함된 상태는 비정상 값으로 제공될 수 있으며 하드웨어에서 사용하기 전에 플러시될 수도 있고 그렇지 않을 수도 있습니다.

  • 최소 또는 최대 연산은 비교를 위해 비정규를 플러시하지만, 결과는 비정규로 플러시될 수도 있고, 플러시되지 않을 수도 있습니다.

  • 작업에 대한 NaN 입력은 출력에서 항상 NaN을 생성합니다. 그러나 NaN의 정확한 비트 패턴은 동일하게 유지되지 않아도 됩니다(작업이 원시 이동 명령이 아니면 데이터를 변경하지 않습니다.)

  • 한 피연산자만 NaN인 최소 또는 최대 연산은 다른 피연산자를 결과로 반환합니다(앞에서 살펴본 비교 규칙과 반대). IEEE 754R 규칙입니다.

    Direct3D 10 이상의 산술 규칙은 "quiet"와 "signaling" NaN 값(QNaN 및 SNaN)을 구분하지 않습니다. 모든 "NaN" 값은 동일한 방식으로 처리됩니다.

  • min() 또는 max()에 대한 두 입력이 모두 NaN이면 모든 NaN이 반환됩니다.

  • IEEE 754R 규칙에 따르면, min(-0,+0) == min(+0,-0) == -0, max(-0,+0) == max(+0,-0) == +0이며, 이는 부호를 유지합니다. 이는 부호 있는 0에 대한 비교 규칙과는 대조적입니다(위에 명시됨). Direct3D 11에서는 여기서 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가 1 ULP보다 더 느슨한 허용 오차로 호출하는 모든 지침의 경우 더 느슨한 허용 오차가 허용됨).

  • 융합 연산은 융합이 아닌 작업과 동일한 NaN 규칙을 준수합니다.

  • sqrt 및 rcp에는 1 ULP 허용 오차가 있습니다. 셰이더 역수 및 역제곱근 명령 rcprsq은 각각 별도의 완화된 정밀도 요구 사항을 가지고 있습니다.

  • 곱하기와 나누기는 각각 32비트 부동 소수점 정밀도 수준에서 작동합니다(곱하기는 0.5 ULP, 역수는 1.0 ULP에 대한 정확도를 가집니다). x/y를 직접 구현하는 경우 결과는 2단계 메서드보다 크거나 같아야 합니다.

64비트(배정밀도) 부동 소수점 규칙

하드웨어 및 디스플레이 드라이버는 필요에 따라 배정밀도 부동 소수점을 지원합니다. 지원 여부를 나타내기 위해, ID3D11Device::CheckFeatureSupport을 호출할 때, 드라이버는 D3D11_FEATURE_DOUBLESDoublePrecisionFloatShaderOpsD3D11_FEATURE_DATA_DOUBLES에서 TRUE로 설정합니다. 드라이버와 하드웨어는 모든 배정밀도 부동 소수점 명령을 지원해야 합니다.

배정밀도 지침은 IEEE 754R 동작 요구 사항을 따릅니다.

비정규화된 값 생성에 대한 지원은 배정밀도 데이터에 필요합니다(플러시-0 동작 없음). 마찬가지로, 지침은 비정규화된 데이터를 부호가 있는 0으로 읽지 않고 비정규화된 값을 존중합니다.

16비트 부동 소수점 규칙

Direct3D 11은 부동 소수점 숫자의 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비트 부동 소수점 규칙

Direct3D 11은 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으로 고정됩니다.

리소스

텍스처