double在没有抛出异常的情况下,在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
Run Code Online (Sandbox Code Playgroud)
我对第二种方法的问题是:
根据我的研究,这应该精确地确定任何给定是否x是有限的.这是真的?
它是解决IL中任务的最佳方式(性能方面),还是有更好(更快)的解决方案?
PS我非常感谢建议运行我自己的基准并找出答案,并且肯定会这样做.只是想到也许有人已经有类似的问题,并知道答案.PPS是的,我意识到我们在这里谈论的是纳秒,是的,它们对我的具体情况很重要
Tho*_*oub 10
微软使用这个:
public unsafe static bool IsNaN(double d)
{
return (*(UInt64*)(&d) & 0x7FFFFFFFFFFFFFFFL) > 0x7FF0000000000000L;
}
Run Code Online (Sandbox Code Playgroud)
与此:
public unsafe static bool IsInfinity(double d)
{
return (*(long*)(&d) & 0x7FFFFFFFFFFFFFFF) == 0x7FF0000000000000;
}
Run Code Online (Sandbox Code Playgroud)
除非使用!double.IsNaN(x) && !double.IsInfinity(x)是你的程序的真正瓶颈,我怀疑,我建议你使用这些功能,它们将更容易阅读和维护.
| 归档时间: |
|
| 查看次数: |
1414 次 |
| 最近记录: |