c# – 检测双精度是否有限的最快方法?

c# – 检测双精度是否有限的最快方法?,第1张

概述在没有抛出异常的情况下,在IL中检测双值是否为有限值(NaN和正/负无穷大)的最快方法是什么? 我正在考虑以下方法(仅为了方便读者使用c#表示法,在我的项目中,我使用的是IL): >!double.IsNaN(x)&& !double.IsInfinity(x) – 最明显的,也可能是最慢的,因为涉及2个方法调用. >(*(((long *)& x))& 0x7fffffffffffffffL)< 在没有抛出异常的情况下,在IL中检测双值是否为有限值(NaN和正/负无穷大)的最快方法是什么?

我正在考虑以下方法(仅为了方便读者使用c#表示法,在我的项目中,我使用的是IL):

>!double.IsNaN(x)&& !double.IsInfinity(x) – 最明显的,也可能是最慢的,因为涉及2个方法调用.
>(*(((long *)& x))& 0x7fffffffffffffffL)< 0x7ff0000000000000L
或在IL:

ldloca x  conv.u   ldind.i8   ldc.i8 0x7fffffffffffffff  and   ldc.i8 0x7ff0000000000000  clt

我对第二种方法的问题是:

>根据我的研究,这应该精确地确定任何给定的x是否是有限的.这是真的?
>它是解决IL中任务的最佳方式(性能方面),还是有更好(更快)的解决方案?

附:我非常感谢建议运行我自己的基准并找出答案,并且肯定会这样做.只是想到也许有人已经有类似的问题,并知道答案.
P.P.S.是的,我意识到我们在这里谈论的是纳秒,是的,它们对我的特殊情况很重要

解决方法 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)是你程序的真正瓶颈,我怀疑,我建议你使用这些功能,它们将更容易阅读和维护.

总结

以上是内存溢出为你收集整理的c# – 检测双精度是否有限的最快方法?全部内容,希望文章能够帮你解决c# – 检测双精度是否有限的最快方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249152.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存