浮点规则 (Direct3D 10)
Direct3D 10 支持几种不同的浮点表示形式。 所有浮点计算都在 IEEE 754 32 位单精度浮点行为的定义子集下运行。
32 位Floating-Point规则
有两组规则:符合 IEEE-754 的规则和那些偏离标准的规则。
遵循 IEEE-754 规则
这些规则中的一些是 IEEE-754 提供选择的单个选项。
- 除以 0 产生 +/- INF,除了会导致 NaN 的 0/0 以外。
- (+/-) 0 的 log 产生 -INF。 负值(-0 除外)的 log 产生 NaN。
- 负数的倒数平方根 (rsq) 或平方根 (sqrt) 产生 NaN。 例外情况是 -0;sqrt(-0) 产生 -0,而 rsq(-0) 产生 -INF。
- INF - INF = NaN
- (+/-)INF / (+/-)INF = NaN
- (+/-)INF * 0 = NaN
- NaN(任何 OP)任何值 = 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 位,而不是执行最近舍入,因为后者将导致至多 1 ULP 的误差。
- 不支持浮点异常、状态位或陷阱。
- Denorm 在任何浮点数学运算的输入和输出上被刷新为符号保留的零。 对于不操作数据的任何 I/O 或数据移动操作,均例外。
- 包含浮点值(如 Viewport MinDepth/MaxDepth、BorderColor 值等)的状态可能作为非诺姆值提供,在硬件使用之前可以刷新,也可能不刷新。
- 最小值或最大值运算会刷新 denorm 以进行比较,但结果可能会或可能不会刷新 denorm。
- 操作的 NaN 输入始终在输出时生成 NaN,但 NaN 的确切位模式不需要保持相同的 (,除非操作是原始移动指令 -这根本不会改变数据)
- 只有一个操作数为 NaN 的最小或最大运算返回另一个操作数,结果 (与上述比较规则) 相反。 这是 Direct3D 10 中必需的新 IEEE 规则 (IEEE 754R) 。
- 另一个新的 IEEE 754R 规则是最小值 (-0,+0) == min (+0,-0) == -0, 和 max (-0,+0) == max (+0,-0) == +0(遵循符号),这与上面) 所述的带符号零 (的比较规则相反。 Direct3D 10 在此处建议 IEEE 754R 行为,但不会强制实施;允许使用忽略符号的比较来使零的结果依赖于参数的顺序。
- x*1.0f 的结果始终是 x(除了 denorm 刷新)。
- x/1.0f 的结果始终是 x(除了 denorm 刷新)。
- x +/- 0.0f 的结果始终是 x(除了 denorm 刷新)。 但是 -0 + 0 = +0。
- 融合运算(例如 mad、dp3)产生的结果与运算的未融合扩展的评估的最差的串行排序一样准确。 请注意,出于容差目的,最差可能排序的定义不是给定融合运算的固定定义;它取决于输入的特定值。 未合并扩展中的单个步骤 (每个允许 1 个 ULP 容差,或者对于 Direct3D 10 调用的任何指令,其容差比 1 ULP 更宽松,) 允许的容错越宽松。
- 融合运算遵守与非融合运算相同的 NaN 规则。
- 每个运算在 32 位浮点精度级别 (精度为 1 ULP) 。
16 位Floating-Point规则
Direct3D 10 还支持浮点数的 16 位表示形式。
格式:
- 1 个符号位 (s) 在 MSB 位位置
- 5 位偏置指数 (e)
- 10 位的分数 (f),具有附加的隐藏位
float16 值 (v) 遵循以下规则:
- 如果 e == 31 且 f != 0,那么 v 是 NaN,无论 s 是什么
- 如果 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(有符号零)
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 位格式的分数 (f) 为 6 位,10 位格式的分数 (f) 为 5 位,在任一情况下都具有附加的隐藏位。
float11/float10 值 (v) 遵循以下规则:
- 如果 e == 31 且 f != 0,那么 v 是 NaN
- 如果 e == 31 且 f == 0,那么 v = 正无穷
- 如果 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。
- 任何将导致数字小于零的操作都会被固定为零。
相关主题