浮點規則 (Direct3D 10)
Direct3D 10 支援數個不同的浮點表示法。 所有浮點運算都會在 IEEE 754 32 位單精度浮點行為定義的子集下運作。
-
32 位 Floating-Point 規則
- 接受 IEEE-754 規則
- IEEE-754 規則 的偏差或其他需求
- 16 位 Floating-Point 規則
- 11 位和 10 位 Floating-Point 規則
- 相關主題
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 位浮點數會保留反數。
- 任何會導致數位小於零的作業,都會固定為零。
相關主題