What is the fastest way to detect whether a double
value is a finite value (neither NaN nor positive/negative infinity) in IL without throwing an exception?
I was considering the following approaches (c# notation for reader's convenience only, in my project I'm using IL for this):
!double.IsNaN(x) && !double.IsInfinity(x)
- the most obvious and, probably, the slowest because 2 method calls are involved.(*(((long*) &x)) & 0x7fffffffffffffffL) < 0x7ff0000000000000L
or in IL:
ldloca x
conv.u
ldind.i8
ldc.i8 0x7fffffffffffffff
and
ldc.i8 0x7ff0000000000000
clt
My questions about the second approach are:
According to my research, this should precisely determine whether any given
x
is finite. Is this true?Is it the best possible way (performance-wise) to solve the task in IL, or is there a better (faster) solution?
P.S. I do appreciate recommendations to run my own benchmarks and find out, and will most certainly do this. Just thought maybe someone already had similar problem and knows the answer. P.P.S. Yes, I realize that we are talking abot nanoseconds here, and yes, they are important for my particular case
Microsoft use this:
And this:
Unless the use of
!double.IsNaN(x) && !double.IsInfinity(x)
is the real bottleneck of your program, which I doubt, I recommend you to use theses functions, they will be easier to read and maintain.