Кстати, тут говорят, что код линейный, но на самом деле он тоже выполняется за O(количество битов), потому что нам пришлось бы добавлять пропорциональное количество строчек при переходе на другое количество битов.
Код нечитаемый (хотя с комментном сойдёт), но если функция вызывается часто, то всё оправдывается выигрышем в производительности. Единственный минус - код привязан к 32-битному числу, следовательно, непортабельный.
Как всегда: производительность * портабельность == константа
В общем-то значения не имеет, я мог обойтись и без мнимой единицы. Однако: http://en.wikipedia.org/wiki/Square_root#Square_roots_of_negative_and_complex_numbers
Я придерживаюсь правила, что надо писать логически понятный и красивый код, который асимптотически работает быстро. Извращаться с нетривиальными и deprecated- конструкциями ради лишней микросекунды - удел горе-оптимизаторов. Хочешь скорости - пиши на C.
Как всегда: производительность * портабельность == константа
int == 4
long int = 8
long long int (в C) == 8
Нет, Linux и Firefox - хрен сломаешь.
-1 = -1
1 / -1 = -1 / 1
sqrt(1 / -1) = sqrt(-1 / 1)
sqrt(1) / sqrt(-1) = sqrt(-1) / sqrt(1)
1 / i = i / 1
(1 / i) * i = (i) * i
1 = i * i
1 = -1