在C#中如何处理非规范化的花车?
只要阅读这篇引人入胜的文章 ,就可以在具有非规格化浮点数(浮点数非常接近于0)的Intel CPU上获得20x-200x的速度减速。
SSE有一个选项将它们舍入为0,当遇到这样的浮点值时恢复性能。
C#应用程序如何处理这个? 有没有启用/禁用_MM_FLUSH_ZERO
的选项?
没有这样的select。
C#应用程序中的FPU控制字在启动时由CLR初始化。 改变它不是框架提供的选项。 即使你试图通过禁止_control87_2()来改变它,那么它不会持续很长时间; 任何exception都会导致控制字被CLR中的exception处理实现再次重置。 写的是处理FPU控制字的另一个方面,它允许取消屏蔽浮点exception。 对任何不希望全局状态如此改变的其他托pipe代码也是有害的。
在虚拟机中运行代码时,不直接控制硬件是隐含的限制。 这并不是说在本地代码中很容易做到这一点,当它们也期望FPU具有默认的初始化时,库往往会行事不端。 特别是使用Borland工具创build的exception屏蔽标志,DLLs有一个问题,就是在exception处理方面有一个窍门,使得其他代码不能处理这种exception。 一个非常难以解决的问题,FPU控制字是你可以想象的最糟糕的全局variables。
这不会让你的负担不让你的浮点计算像这样干瞪眼。 使用非规范化计算几乎总是会产生无意义的结果,如果不是从极小的值开始,那么至less从有效数字的快速丢失中产生无意义的结果。 将小于2.2E-308的值截断为0取决于您。 是的,不太实际。 也许这是可以的程序提供无聊的结果比平常慢一点:)