Обратите внимание, что если в вашем наборе инструкций есть инструкция для квадратного корня или мощности, вам будет намного лучше использовать это.Например, в инструкциях с плавающей запятой x87 есть инструкция fsqrt
, а в дополнения SSE2 включена еще одна инструкция sqrtsd
, которая, вероятно, будет намного быстрее, чем большинство решений, написанных на C. На самом деле, по крайней мере, gcc используетинструкции, когда компиляция происходит на компьютере с архитектурой x86.
Однако, для мощности дела обстоят несколько мутно.В наборе команд с плавающей запятой x87 есть инструкция, которую можно использовать для вычисления n * log2 (n), а именно fyl2x
.Другая инструкция, fldl2e
, сохраняет log2 (e) в стеке с плавающей запятой.Возможно, вы захотите взглянуть на них.
Вы также можете взглянуть на то, как это делают отдельные библиотеки C.dietlibc
, например, просто использует fsqrt
:
sqrt:
fldl 4(%esp)
fsqrt
ret
glibc
использует реализацию Sun для машин, где аппаратная инструкция квадратного корня недоступна (под sysdeps/ieee754/flt-32/e-sqrtf.c
), и использует fsqrt
в наборе команд x86 (хотя gcc можно указать вместо него использовать инструкцию sqrtsd
.)