我最近读到了这篇关于NaN
SSE 算术运算中的值:
对两个非数字 (NAN) 参数进行算术运算的结果是未定义的。因此,使用 NAN 参数的浮点运算将与相应汇编指令的预期行为不匹配。
Source: http://msdn.microsoft.com/en-us/library/x5c07e2a(v=vs.100).aspx http://msdn.microsoft.com/en-us/library/x5c07e2a(v=vs.100).aspx
这是否意味着,比如说,添加两个__m128
值可能会转换NaN
到真实的?
如果计算依赖于NaN
值,我需要最终结果是NaN
以及。有什么办法可以做到这一点吗?
当我解释该文本时,它所说的是编译器提供了大致对应于 SSE 指令的各种内部函数。通常,您可以预期编译器将使用 SSE 指令来实现内在函数。然而,这并不严格。内在函数实际上指定了某些抽象计算模型中的操作;他们不直接指定 SSE 指令。在该抽象模型中,对两个 NaN 进行操作的结果(奇怪的是它似乎不允许一个 NaN 和一个数字)是未定义的。因此,例如,将两个 NaN 相加得到的结果可能不是 NaN。
特别是,抽象模型中的操作将受到编译器优化的影响,并且这些优化可能会导致 SSE 指令以外的结果(编译时计算,如果编译器可以推断出 NaN 存在,则省略指令,因此实际上不需要执行添加等)。
看来,如果你想保证为 SSE 指令指定的语义,你可能必须用汇编语言编写,而不是使用微软编译器中的内在函数。
我确实希望供应商不要再忽视浮点语义。如果没有明确的行为,就很难进行工程设计。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)