共用方式為


浮點規則 (Direct3D 10)

Direct3D 10 支援數個不同的浮點表示法。 所有浮點運算都會在 IEEE 754 32 位單精度浮點行為定義的子集下運作。

32 位 Floating-Point 規則

有兩組規則:符合 IEEE-754 的規則,以及偏離標準的規則。

接受 IEEE-754 規則

其中有些規則是 IEEE-754 提供選擇的單一選項。

  • 除 0 會產生 +/- INF,但 0/0 導致 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
  • 當任一或兩個作數為 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位,而不是執行四捨五入到最接近的偶數,因為這會導致最多一個ULP的錯誤。
  • 不支援浮點例外狀況、狀態位或陷阱。
  • Denorms 會排清,以在任何浮點數學運算的輸入和輸出上簽署保留的零。 不會作數據的任何 I/O 或數據移動作業都發生例外狀況。
  • 包含浮點值的狀態,例如 Viewport MinDepth/MaxDepth、BorderColor 值等,可能會提供為非orm 值,而且在硬體使用之前可能或可能不會排清。
  • 最小或最大作業會排清反數,但結果可能或可能不會清除反數。
  • 作業的 NaN 輸入一律會在輸出上產生 NaN,不過 NaN 的確切位模式不需要維持不變(除非作業是原始移動指令 -這完全不會改變數據。
  • 只有一個作數為 NaN 的最小或最大作業會傳回另一個作數作為結果(與上述比較規則相反)。 這是 Direct3D 10 中所需的新 IEEE 規則 (IEEE 754R)。
  • 另一個新的 IEEE 754R 規則是 min(-0,+0) == min(+0,-0) == -0,而 max(-0,+0) == max(+0,-0) == +0,這與簽署零的比較規則相反(如上所述)。 Direct3D 10 建議此處的 IEEE 754R 行為,但不會強制執行;使用忽略符號的比較,允許比較零與參數的順序相依。
  • x*1.0f 一律會產生 x (除清除反orm 外)。
  • x/1.0f 一律會產生 x (除清除反orm 除外)。
  • x +/- 0.0f 一律會產生 x (除反正規清除除外)。 但 -0 + 0 = +0。
  • 融合作業(如瘋子,dp3)產生的結果,不亞於評估作業未注入擴張的最差序列順序。 請注意,針對容錯目的,最差可能排序的定義不是指定融合作業的固定定義;這取決於輸入的特定值。 未注入擴充中的個別步驟都允許 1 個 ULP 容錯(或針對 Direct3D 10 所呼叫的任何指示,使用比 1 ULP 更寬鬆的容錯來呼叫,則允許越寬鬆的容錯)。
  • Fused 作業遵循與非融合作業相同的 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*infinity (帶正負號的無限大)
  • 如果 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 (帶正負號零)

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 位格式的分數 (f) 6 位,10 位格式為 5 位的 fraction (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 (零)

32 位浮點規則也會保留 11 位和 10 位浮點數,並針對上述位配置進行調整。 例外狀況包括:

  • 精確度:32 位浮點規則遵守 0.5 ULP。
  • 10/11 位浮點數會保留反數。
  • 任何會導致數位小於零的作業,都會固定為零。

資源 (Direct3D 10)