Каков самый быстрый способ определить, является ли значение double
конечным значением (ни NaN, ни положительной/отрицательной бесконечности) в IL, не выбрасывая исключение?Самый быстрый способ определить, является ли двойной конечным?
я рассматривал следующие подходы (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.S. Я действительно ценю рекомендации для запуска своих собственных тестов и выяснения, и, безусловно, это сделаю. Просто подумал, может быть, у кого-то уже была аналогичная проблема и он знает ответ. P.P.S. Да, я понимаю, что мы говорим Аботы наносекунд здесь, и да, они очень важны для моего конкретного случая
Поместите '' (* ((long *) & x)) & 0x7fffffffffffffffL) <0x7ff0000000000000L'' в функцию '' inline''' и будьте счастливы. –
@BinkanSalaryman да, он мог, но если OP не единственный, кто поддерживает код, он должен написать * очень, очень, очень хороший комментарий ... –
Да, действительно. Если это не требуется, просто придерживайтесь данных .NET-методов. –