的的x87 FPU值得注意的是使用内部80位精度模式时,这往往会导致跨编译器和机器意想不到和不可再现的结果。 In my search在.NET上可重现的浮点运算,我发现.NET(Microsoft和Mono)的两个主要实现都是在64位模式下发出SSE指令而不是x87。SSE浮点算法是否可重现?
SSE(2)使用用于32位浮点数严格的32位寄存器,和用于64位浮点数严格的64位寄存器。通过设置appropriate control word,可以选择性地将非正常通道清零。
因此这样看来,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, Handbook of Floating-Point Arithmetic - 第107页
但是:
此外,您不能使用SSE SSE2或浮动点,因为它太 下,指定为确定性。 - 约翰Watte http://www.gamedev.net/topic/499435-floating-point-determinism/#entry4259411
我敢肯定,如果在网络上有两个相互矛盾的观点,你会在这里得到一个论点(也可能至少有第三个观点) – KevinDTimm 2013-02-28 22:51:47
@KevinDTimm虽然没有使这个问题成为主观的。上证所可重现或不重要。 – Asik 2013-02-28 22:55:15
“SSE或SSE2 [指定得太不明确以致无法确定]”。我不认为自己是这方面的专家,但这听起来像是BS。在链接中,有关超验的库函数的讨论,当然在一个平台上可能存在缺陷,而在另一个平台上可能存在缺陷,因为实际上在任何编译器的优化器中都可能存在(实际上可能是),但对于SSE并没有提及/ SSE2本身。他有他的意思吗? – 2013-03-01 00:02:45