如何在C#中处理非规范化的花车?

只要阅读这篇有关在非常规浮点数(非常接近于0的浮点数)的英特尔CPU上可以获得的20x-200x速度减慢的迷人文章。

SSE有一个选项将它们舍入为0,当遇到这样的浮点值时恢复性能。

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


没有这样的选择。

C#应用程序中的FPU控制字在启动时由CLR初始化。 改变它不是框架提供的选项。 即使你试图通过禁止_control87_2()来改变它,它也不会持续很长时间; 任何异常都会导致控制字被CLR中的异常处理实现再次重置。 其中写了处理FPU控制字的另一个方面,它允许取消屏蔽浮点异常。 对任何其他不会期望全局状态如此改变的托管代码也是有害的。

在虚拟机中运行代码时,不直接控制硬件是隐含的限制。 这并不是说在本地代码中很容易做到这一点,但是当它们也期望FPU具有默认的初始化时,库往往会行事不端。 特别是使用Borland工具创建的异常屏蔽标志,DLLs有一个问题,就是在打开异常的时候有一个诀窍,使得其他代码不能处理这种异常。 一个非常难以解决的问题,FPU控制字是你可以想象的最糟糕的全局变量。

这不会让你的负担不让你的浮点计算变成这样。 使用非规范化计算几乎总是会产生无意义的结果,如果不是从极小值开始,那么至少从有效数字的快速丢失中产生无意义结果。 将小于2.2E-308的值截断为0取决于您。 是的,不太实际。 也许这对于一个程序提供比平常慢一点的无意义结果是可以的:)

链接地址: http://www.djcxy.com/p/85517.html

上一篇: How are denormalized floats handled in C#?

下一篇: What is a subnormal floating point number?