8087 Floating Point
Unit芯片设计是Intel数十亿美元的错误。这个想法在纸面上看起来不错,给它一个8寄存器堆栈,以80位扩展精度存储值。这样就可以编写中间值不太可能丢失有效数字的计算。
但是,野兽是无法优化的。将值从FPU堆栈存储回内存的成本很高。因此,将它们保留在FPU中是一个强大的优化目标。如果计算足够深,那么只有8个寄存器将不可避免地需要回写。它还被实现为堆栈,而不是可自由寻址的寄存器,因此也需要进行体 *** *** 作,并且可能产生回写。不可避免地,回写会将值从80位
截断 为64位,从而失去精度。
因此后果是,未优化的代码不会产生与优化的代码相同的结果。当最终需要回写中间值时,对计算的小的更改可能会对结果产生很大的影响。/
fp:strict选项解决了这一问题,它迫使代码生成器发出回写以保持值一致,但不可避免且会造成性能损失。
这是一块完整的岩石,一个艰苦的地方。对于x86抖动,他们只是没有尝试解决问题。
英特尔在设计SSE指令集时没有犯同样的错误。XMM寄存器是可自由寻址的,并且不存储额外的位。如果要获得一致的结果,则可以使用AnyCPU目标和64位 *** 作系统进行编译是快速的解决方案。x64抖动使用SSE而不是FPU指令进行浮点运算。尽管这增加了计算可以产生不同结果的第三种方式。如果由于丢失太多有效数字而导致计算错误,那么它将始终是错误的。的确,这有点像溴化物,但通常仅在程序员看来是这样。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)