浮点规则 (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。
  • 任何将导致数字小于零的操作都会被固定为零。

Direct3D 10) (资源