强制浮点在.NET中具有确定性?

强制浮点在.NET中具有确定性?,第1张

强制浮点在.NET中具有确定性?

8087 Floating Point
Unit芯片设计是Intel数十亿美元的错误。这个想法在纸面上看起来不错,给它一个8寄存器堆栈,以80位扩展精度存储值。这样就可以编写中间值不太可能丢失有效数字的计算。

但是,野兽是无法优化的。将值从FPU堆栈存储回内存的成本很高。因此,将它们保留在FPU中是一个强大的优化目标。如果计算足够深,那么只有8个寄存器将不可避免地需要回写。它还被实现为堆栈,而不是可自由寻址的寄存器,因此也需要进行体 *** *** 作,并且可能产生回写。不可避免地,回写会将值从80位
截断 为64位,从而失去精度。

因此后果是,未优化的代码不会产生与优化的代码相同的结果。当最终需要回写中间值时,对计算的小的更改可能会对结果产生很大的影响。/
fp:strict选项解决了这一问题,它迫使代码生成器发出回写以保持值一致,但不可避免且会造成性能损失。

这是一块完整的岩石,一个艰苦的地方。对于x86抖动,他们只是没有尝试解决问题。

英特尔在设计SSE指令集时没有犯同样的错误。XMM寄存器是可自由寻址的,并且不存储额外的位。如果要获得一致的结果,则可以使用AnyCPU目标和64位 *** 作系统进行编译是快速的解决方案。x64抖动使用SSE而不是FPU指令进行浮点运算。尽管这增加了计算可以产生不同结果的第三种方式。如果由于丢失太多有效数字而导致计算错误,那么它将始终是错误的。的确,这有点像溴化物,但通常仅在程序员看来是这样。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5045170.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存