Кстати, тут говорят, что код линейный, но на самом деле он тоже выполняется за O(количество битов), потому что нам пришлось бы добавлять пропорциональное количество строчек при переходе на другое количество битов.
Код нечитаемый (хотя с комментном сойдёт), но если функция вызывается часто, то всё оправдывается выигрышем в производительности. Единственный минус - код привязан к 32-битному числу, следовательно, непортабельный.
Как всегда: производительность * портабельность == константа
В общем-то значения не имеет, я мог обойтись и без мнимой единицы. Однако: http://en.wikipedia.org/wiki/Square_root#Square_roots_of_negative_and_complex_numbers
Как всегда: производительность * портабельность == константа
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