关于.net:如何在C#中处理非规范化浮点数?

How are denormalized floats handled in C#?

只需阅读这篇引人入胜的文章,了解使用非规范化浮点(浮点数非常接近0)的Intel CPU可以获得的20x-200x速度减慢。

SSE有一个选项将这些值四舍五入为0,在遇到此类浮点值时恢复性能。

C应用程序如何处理这个问题?是否有启用/禁用_MM_FLUSH_ZERO的选项?


没有这样的选择。

C应用程序中的fpu控制字在启动时由clr初始化。更改它不是框架提供的选项。即使您试图通过pinvoking Control87 2()更改它,它也不会持续太久;任何异常都会导致控制字再次被clr内的异常处理实现重置。它是为处理FPU控制字的另一个方面而编写的,它允许取消对浮点异常的屏蔽。它还将对任何其他不希望全局状态像那样更改的托管代码有害。

在虚拟机中运行代码时,对硬件没有直接控制是一种隐含的限制。在本机代码中也不容易做到这一点,当库也希望fpu具有默认初始化时,它们往往会表现得不正确。特别是异常屏蔽标志的一个问题,用Borland工具创建的DLL有打开异常的诀窍,使其他代码失败,而这些代码不是为处理此类异常而编写的。要解决的一个非常难看的问题是,fpu控制字是您能想象到的最糟糕的全局变量。

这确实给你带来了负担,让你的浮点计算像这样乱成一团。用非规格化计算几乎总是会产生无意义的结果,如果不是从根本上小的值,那么至少是从有效数字的快速丢失。截断小于2.2e-308到0的值由您决定。是的,不太实际。也许对于一个程序来说,交付一个比正常程序慢一点的无意义的结果是可以的。)