6

我最近阅读了有关NaNSSE 算术运算中的值的文章:

作用于两个非数字 (NAN) 参数的算术运算的结果是未定义的。因此,使用 NAN 参数的浮点运算将与相应汇编指令的预期行为不匹配。

来源: http: //msdn.microsoft.com/en-us/library/x5c07e2a (v=vs.100).aspx

这是否意味着,例如,添加两个__m128值可能会将 a 转换NaN为实数?

如果计算依赖于一个NaN值,我也需要最终结果NaN。有没有办法做到这一点?

4

1 回答 1

5

当我解释该文本时,它的意思是编译器提供了大致对应于 SSE 指令的各种内在函数。通常,您可以预期编译器将使用 SSE 指令来实现内在函数。但是,这并不严格。内在函数实际上指定了一些抽象计算模型中的操作;他们没有直接指定 SSE 指令。在那个抽象模型中,对两个 NaN 进行操作的结果(奇怪的是它似乎不允许一个 NaN 和一个数字)是未定义的。因此,例如,添加两个 NaN 得到的结果可能不是 NaN。

特别是,抽象模型中的操作将受到编译器优化,并且这些优化可能会导致 SSE 指令以外的东西(编译时的计算,如果编译器可以推断出存在 NaN 则省略指令,因此它实际上不需要执行添加等)。

看来,如果您想保证为 SSE 指令指定的语义,您可能必须用汇编语言编写,而不是在 Microsoft 的编译器中使用内部函数。

我确实希望供应商不要再对浮点语义漠不关心了。在没有明确规定的行为的情况下很难进行工程。

于 2013-03-22T00:31:22.990 回答