c# – 检测双精度是否有限的最快方法?
发布时间:2020-12-15 08:25:19 所属栏目:百科 来源:网络整理
导读:在没有抛出异常的情况下,在IL中检测双值是否为有限值(NaN和正/负无穷大)的最快方法是什么? 我正在考虑以下方法(仅为了方便读者使用c#表示法,在我的项目中,我使用的是IL): !double.IsNaN(x) !double.IsInfinity(x) – 最明显的,也可能是最慢的,因为涉及2
在没有抛出异常的情况下,在IL中检测双值是否为有限值(NaN和正/负无穷大)的最快方法是什么?
我正在考虑以下方法(仅为了方便读者使用c#表示法,在我的项目中,我使用的是IL): >!double.IsNaN(x)&& !double.IsInfinity(x) – 最明显的,也可能是最慢的,因为涉及2个方法调用. ldloca x conv.u ldind.i8 ldc.i8 0x7fffffffffffffff and ldc.i8 0x7ff0000000000000 clt 我对第二种方法的问题是: >根据我的研究,这应该精确地确定任何给定的x是否是有限的.这是真的? 附:我非常感谢建议运行我自己的基准并找出答案,并且肯定会这样做.只是想到也许有人已经有类似的问题,并知道答案. 解决方法
Microsoft使用
this:
public unsafe static bool IsNaN(double d) { return (*(UInt64*)(&d) & 0x7FFFFFFFFFFFFFFFL) > 0x7FF0000000000000L; } 和this: public unsafe static bool IsInfinity(double d) { return (*(long*)(&d) & 0x7FFFFFFFFFFFFFFF) == 0x7FF0000000000000; } 除非使用!double.IsNaN(x)&& !double.IsInfinity(x)是你程序的真正瓶颈,我怀疑,我建议你使用这些功能,它们将更容易阅读和维护. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |