Это просто для удовлетворения моего любопытства.
Есть ли реализация этого:
float InvSqrt (float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i>>1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}
в С#? Если он существует, отправьте код.
Думаю, я должен был упомянуть, что искал "безопасную" реализацию... В любом случае, код BitConverter решает проблему. Идея союза интересна. Я проверю и опубликую свои результаты.
Изменить: Как и ожидалось, небезопасный метод является самым быстрым, за которым следует объединение (внутри функции), за которым следует битконвертер. Функции выполнялись 10000000 раз, а я использовал класс System.Diagnostics.Stopwatch для синхронизации. Результаты расчетов показаны в скобках.
Input: 79.67
BitConverter Method: 00:00:01.2809018 (0.1120187)
Union Method: 00:00:00.6838758 (0.1120187)
Unsafe Method: 00:00:00.3376401 (0.1120187)
Для полноты я протестировал встроенный метод Math.Pow и "наивный" метод (1/Sqrt (x)).
Math.Pow(x, -0.5): 00:00:01.7133228 (0.112034710535584)
1 / Math.Sqrt(x): 00:00:00.3757084 (0.1120347)
Разница между 1/Math.Sqrt() настолько мала, что я не думаю, что нужно использовать метод Unsafe Fast InvSqrt() в С# (или любой другой небезопасный метод). Если действительно не нужно выжимать последний бит сока из CPU... 1/Math.Sqrt() также намного точнее.