Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中处理非规范化浮点?_C#_.net_Performance_Intel_Sse - Fatal编程技术网

如何在C#中处理非规范化浮点?

如何在C#中处理非规范化浮点?,c#,.net,performance,intel,sse,C#,.net,Performance,Intel,Sse,只要读一下这篇文章,就可以知道在英特尔CPU上使用非规范化浮点数(浮点数非常接近于0)时会出现20x-200x的速度减慢 SSE有一个选项可以将这些值舍入为0,从而在遇到此类浮点值时恢复性能 C#应用程序如何处理这个问题?是否有启用/禁用\u MM\u FLUSH\u ZERO的选项?没有此类选项 C#应用程序中的FPU控制字在启动时由CLR初始化。更改它不是框架提供的选项。即使你试图通过品吐来改变它,它也不会持续很久;任何异常都会导致CLR内的异常处理实现再次重置控制字。它是为了处理FPU控制

只要读一下这篇文章,就可以知道在英特尔CPU上使用非规范化浮点数(浮点数非常接近于0)时会出现20x-200x的速度减慢

SSE有一个选项可以将这些值舍入为0,从而在遇到此类浮点值时恢复性能


C#应用程序如何处理这个问题?是否有启用/禁用
\u MM\u FLUSH\u ZERO
的选项?

没有此类选项

C#应用程序中的FPU控制字在启动时由CLR初始化。更改它不是框架提供的选项。即使你试图通过品吐来改变它,它也不会持续很久;任何异常都会导致CLR内的异常处理实现再次重置控制字。它是为了处理FPU控制字的另一个方面而编写的,它允许对浮点异常进行解密。它还将对任何其他不希望全局状态像那样更改的托管代码有害

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


这会给您带来负担,让您的浮点计算不会像这样失控。使用非规范化计算几乎总是产生无意义的结果,如果不是从非常小的值,那么至少是从有效数字的快速丢失。将小于2.2E-308的值截断为0取决于您。是的,不太实用。也许一个程序可以比正常程序慢一点交付无意义的结果:)

虽然我完全接受你的答案,这是不可能做到的,但我确实对问题的琐碎化表示异议,双倍截断可能很少见;但在执行音频处理(例如数字滤波器、延迟线等)时,对单音进行非规范化非常容易。考虑到x86体系结构上的性能损失是可怕的,请求抛出非规范异常将是非常好的。为什么不也浮动呢?当代码像这样本地化时,Pinvoking _control87_2()就不是问题了。使用冲洗,不要忘记将其设置回原位。