명백한 두 가지 대답은 이분법 (semi-slow)과 Newton-Raphson/Leibniz 반복 (보통 더 빠름)입니다. 사람의 재미를 망치고에서 유지하려면, 나는 질문에 reinterpret_cast을 다하겠습니다 - 여기 뉴튼 - 랩슨 기술을 사용하여 8086 어셈블리 언어의 정수 제곱근의 구현입니다 :
isqrt proc uses di, number:word
;
; uses bx, cx, dx
;
mov di,number
mov ax,255
start_loop:
mov bx,ax
xor dx,dx
mov ax,di
div bx
add ax,bx
shr ax,1
mov cx,ax
sub cx,bx
cmp cx,2
ja start_loop
ret
isqrt endp
이 일부 개선 열려 - sqrt (x)에서 초기 추측으로 x/2를 사용합니다. 386+ 지침을 사용하면 bsr
을 사용하여 로그 x의 대략적인 근사값을 얻도록 설정된 최상위 비트를 찾아서이를 2로 나눠서 초기 근사값을 구할 수 있습니다.
OTOH, 이것은 실제로 고대 프로세서에서만 의미가 있습니다. 부동 소수점 하드웨어가 내장 된 486 (또는 그 이후) 이후로, FSQRT
명령어가이 명령어를 능가 할 것이라는 점은 거의 확실합니다.
'#include'[개행 문자]''double sqrt (double x) {return std :: sqrt (x); }' –
@James :'#include'[개행]'double sqrt (double x) {return std :: pow (x, 0.5); }' –
http : //en.wikipedia.org/wiki/Newton % 27s_method – Anycorn