gpt4 book ai didi

c# - 如何在 C# 中处理非规范化 float ?

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:44 27 4
gpt4 key购买 nike

只需阅读此 fascinating article关于使用非规范化 float (非常接近 0 的 float )的 Intel CPU 可能会导致 20x-200x 的减速。

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

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

最佳答案

没有这样的选项。

C# 应用程序中的 FPU 控制字在启动时由 CLR 初始化。更改它不是框架提供的选项。即使您尝试通过调用 _control87_2() 来更改它那么它不会持续很长时间;任何异常都会导致控制字被 CLR 内部的异常处理实现再次重置。这是为了处理 FPU 控制字的另一个方面而编写的,它允许揭露浮点异常。这也将对任何其他不希望全局状态像这样更改的托管代码不利。

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

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

关于c# - 如何在 C# 中处理非规范化 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com