gpt4 book ai didi

c# - 检测 double 是否有限的最快方法?

转载 作者:太空狗 更新时间:2023-10-29 21:08:27 28 4
gpt4 key购买 nike

检测是否为 double 的最快方法是什么? value 是 IL 中的有限值(既不是 NaN 也不是正/负无穷大)而不抛出异常?

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

  1. !double.IsNaN(x) && !double.IsInfinity(x) - 最明显,也可能是最慢的,因为涉及 2 个方法调用。

  2. (*(((long*) &x)) & 0x7fffffffffffffffL) < 0x7ff0000000000000L

或在 IL 中:

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

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

  1. 根据我的研究,这应该可以精确地确定是否给定了 x是有限的。这是真的吗?

  2. 这是在 IL 中解决任务的最佳方式(性能方面),还是有更好(更快)的解决方案?

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

最佳答案

微软使用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# - 检测 double 是否有限的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30909771/

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