다음을 통해 공유


부동 소수점 규칙

Direct3D는 여러 부동 소수점 표현을 지원합니다. 모든 부동 소수점 계산은 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 이상은 IEEE-754와 동일한 요구 사항을 정의합니다. 32비트 부동 소수점 연산은 무한정 정확한 결과의 0.5 단위 마지막 위치(ULP) 이내의 결과를 생성합니다. 이것은, 예를 들어, 하드웨어가 가장 가까운 짝수로 반올림을 수행하는 대신 최대 0.5 ULP의 오류가 발생하는 한도 내에서 결과를 32비트로 자르는 것이 허용된다는 것을 의미합니다. 이 규칙은 더하기, 빼기 및 곱하기만 적용됩니다.

    이전 버전의 Direct3D는 IEEE-754보다 느슨한 요구 사항을 정의합니다. 32비트 부동 소수점 연산은 무한정 정확한 결과의 1개의 ULP(단위 마지막 위치) 내에 있는 결과를 생성합니다. 예를 들어 하드웨어는 최대 하나의 ULP 오류가 발생하므로 가장 가까운 짝수로 반올림을 수행하는 대신 결과를 32비트로 잘라 내도록 허용됩니다.

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

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

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

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

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

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

    부동 소수점 최소 및 최대 연산에 대한 IEEE-754R 사양은 min 또는 max에 대한 입력 중 하나가 조용한 QNaN 값인 경우 작업의 결과가 다른 매개 변수임을 나타냅니다. 다음은 그 예입니다.

    min(x,QNaN) == min(QNaN,x) == x (same for max)
    

    IEEE-754R 사양의 수정은 하나의 입력이 QNaN 값과 시그널링 SNaN 값인 경우 최소값 및 최대값에 대해 다른 동작을 채택했습니다.

    min(x,SNaN) == min(SNaN,x) == QNaN (same for max)
    
    

    일반적으로 Direct3D는 산술 표준인 IEEE-754 및 IEEE-754R을 따릅니다. 그러나이 경우, 우리는 편차가 있습니다.

    Direct3D 10 이후의 산술 규칙에서는 QNaN(조용한 NaN)과 SNaN(신호 NaN) 값 간의 구분을 하지 않습니다. 모든 NaN 값은 동일한 방식으로 처리됩니다. min 및 max의 경우 NaN 값에 대한 Direct3D 동작은 IEEE-754R 정의에서 QNaN이 처리되는 방식과 같습니다. (완전성을 위해 - 두 입력이 모두 NaN이면 모든 NaN 값이 반환됩니다.)

  • IEEE 754R의 또 다른 규칙으로는 min(-0,+0) == min(+0,-0) == -0, 그리고 max(-0,+0) == max(+0,-0) == +0 인데, 이는 부호가 있는 0에 대한 비교 규칙과 달리 부호를 반영합니다(앞에서 살펴본 대로). Direct3D는 여기서 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는 부동 소수점 숫자의 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비트 및 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으로 제한됩니다.

부록

리소스

질감