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) 任意值 = NaN
  • 比較 EQ、GT、GE、LT 和 LE,若任一個或兩個運算元皆為 NaN,則傳回 FALSE
  • 比較會忽略 0 的正負號 (因此 +0 等於 -0)。
  • 比較 NE,若任一個或兩個運算元皆為 NaN,則傳回 TRUE
  • 任何非 NaN 值與 +/- INF 比較會傳回正確的結果。

IEEE-754 規則的偏差或額外需求

  • IEEE-754 需要浮點運算產生結果,此結果為最接近無限精確結果的可表示值,也稱為 round-to-nearest-even。 不過,Direct3D 10 會定義鬆散的需求:32 位浮點運算會產生一個單位最後一個位置的結果, (1 個 ULP) 無限精確的結果。 這表示,例如硬體允許截斷結果至 32 位元,而不是執行 round-to-nearest-even,因為這樣會讓最多一個 ULP 產生錯誤。
  • 不支援浮點例外、狀態位元或設陷。
  • Denorm 會在任何浮點數學運算的輸入和輸出上,排清至保留正負號的零。 任何不會運算元據的 I/O 或資料移動作業,都有例外狀況。
  • 包含浮點值的狀態,例如 Viewport MinDepth/MaxDepth、BorderColor 值等,可能會提供為 denorm 值,而且可能會在硬體使用之前排清或未排清。
  • 最小值或最大值作業會針對比較排清 denorm,但結果不一定會是排清 denorm。
  • 作業的 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 (,但反正規化) 除外。
  • x/1.0f 一律產生 x (除了會排清 denorm)。
  • x +/- 0.0f 一律產生 x (除了會排清 denorm)。 但是 -0 + 0 = +0。
  • 合併運算 (例如 mad、dp3) 產生的結果肯定比非合併擴展運算可能最差的序列評估順序精確。 請注意,基於容錯目的,最差可能排序的定義不是指定融合作業的固定定義;這取決於輸入的特定值。 未合併擴充中的個別步驟分別允許 1 個 ULP 容錯 (,或針對 Direct3D 10 呼叫的指示,比 1 ULP 更多的 lax 容錯,允許) 的 lax 容錯。
  • 合併運算遵循與非合併運算相同的 NaN 規則。
  • 在 32 位浮點精確度層級上相乘和除數, (精確度為 1 ULP) 。

16 位Floating-Point規則

Direct3D 10 也支援浮點數的 16 位標記法。

格式:

  • 在 MSB 位元位置 1 帶正負號位元 (s)
  • 5 位元偏置指数 (e)
  • 10 位元分數 (f),含一個額外的隱藏位元

(v) 的 float16 值遵循下列規則:

  • 若 e == 31 且 f != 0,則 v 為 NaN,不考慮 s
  • 如果 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 位元浮點數保留 denorm。

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 (零)

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

  • 精確度︰32 位元浮點規則遵循 0.5 ULP。
  • 10/11 位元浮點數保留 denorm。
  • 任何會導致數位小於零的作業都會限制為零。

(Direct3D 10)