浮点规则 (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。
- log of (+/-) 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
- 当任一作数或两个作数为 NaN 时,EQ、GT、GE、LT 和 LE 的比较返回 FALSE。
- 比较忽略 0 的符号(因此 +0 等于 -0)。
- 比较 NE,当任一作数或两个作数为 NaN 返回 TRUE时。
- 任何非 NaN 值与 +/- INF 的比较返回正确的结果。
IEEE-754 规则的偏差或附加要求
- IEEE-754 需要浮点运算才能生成一个结果,该结果是无限精确结果最接近的可表示值,称为舍入到最接近的结果。 但是,Direct3D 10 定义了一个松散的要求:32 位浮点运算产生一个结果,该结果位于无限精确结果的一个单位最后位置(1 个 ULP)内。 这意味着,例如,允许硬件将结果截断为 32 位,而不是执行舍入到最接近的偶数,因为这样最多会导致一个 ULP 出错。
- 不支持浮点异常、状态位或陷阱。
- 将 Denorms 刷新为任何浮点数学运算的输入和输出上的签名保留零。 对于不作数据的任何 I/O 或数据移动作,都存在例外情况。
- 包含浮点值(如 Viewport MinDepth/MaxDepth、BorderColor 值等)的状态可以作为非序值提供,并且可能在硬件使用之前刷新或不刷新。
- 用于比较的最小或最大作刷新非序数,但结果可能或可能不会刷新非序。
- 对作的 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(非非序刷新除外)。
- x +/- 0.0f 始终产生 x(非正数刷新除外)。 但 -0 + 0 = +0。
- 融合运算(如 mad,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,则 v 是 NaN 而不考虑 s
- 如果 e == 31 和 f == 0,则 v = (-1)s*infinity (signed 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)
- 6 位分数 (f) 表示 11 位格式,5 位分数 (f) 表示 10 位格式,在任一情况下都附加隐藏位。
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 位浮点数保留非序数。
- 导致数字小于零的任何作都将固定到零。
相关主题