所述的x87 FPU值得注意的是使用内部80位精度模式时,这往往会导致跨编译器和机器意想不到和不可再现的结果。 我在寻找对.NET重复性浮点运算,我发现.NET(微软和Mono)的两个主要实现发射SSE指令,而不是在的x87 64位模式。
SSE(2)使用用于32位浮点数严格的32位寄存器,和用于64位浮点数严格的64位寄存器。 非正规数可任选地通过设置刷新为零合适的控制字 。
因此,这样看来,SSE不从的x87的精度有关问题的影响,那唯一的变量是反规范的行为,可以被控制。
撇开超越函数(未通过上证所不同的x87原生提供),并使用SSE此事保证在机器和编译器可重复的结果? 难道编译器优化,例如,翻译成不同的结果? 我发现了一些相互矛盾的观点:
如果您有SSE2,使用它,从此幸福地生活之后。 SSE2同时支持32b和64b的操作和中间结果是操作数的大小。 - 贝纳Kreinin, http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html
...
SSE2指令(...)是完全符合IEEE754-1985,他们允许更好的可重复性(由于静态舍入精度)和便携性与其它平台。 Muller等aliis, 浮点运算的手册 -第107页
然而:
此外,您不能使用SSE SSE2或浮动点,因为它太欠指定为确定性。 约翰 - Watte http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411