我最近在SSE算术运算中读到了NaN
值:
作用于两个而不是数字(NAN)参数的算术运算的结果是未定义的。因此,使用NAN参数的浮点运算将与相应汇编指令的预期行为不匹配。
来源:http://msdn.microsoft.com/en-us/library/x5c07e2a(v=vs.100).aspx
这是否意味着,添加两个__m128
值可能会将NaN
转换为实际值?
如果计算依赖于NaN
值,我的最终结果也需要NaN
。有没有办法做到这一点?
答案 0 :(得分:5)
当我解释该文本时,它所说的是编译器提供了大致对应于SSE指令的各种内在函数。通常,您可以期望编译器将使用SSE指令来实现内在函数。但是,这并不严格。内在函数实际上在一些抽象的计算模型中指定了操作;他们没有直接指定SSE指令。在该抽象模型中,操作两个NaN的结果(奇怪的是,它似乎不允许一个NaN和一个数字)是未定义的。因此,您获得的结果(例如,添加两个NaN)可能不是NaN。
特别是,抽象模型中的操作将受到编译器优化的影响,并且那些优化可能会导致除SSE指令之外的其他事情(在编译时进行计算,如果编译器可以推断NaN存在则省略指令,因此它不会需要实际执行添加等等。
似乎如果你想保证为SSE指令指定的语义,你可能必须用汇编语言编写,而不是在微软的编译器中使用内在函数。
我确实希望供应商停止对浮点语义进行简短的讨论。在缺乏明确行为的情况下很难进行工程设计。