부동소수점 데이터는 꼴로 표현된다. (음수일 경우와 0일 경우는 무시했다.)
여기서 두 가지 경우로 나누어보자.

첫번째 n=2k 인 경우
가 된다.

두번째 n=2k+1 인 경우
가 된다.
http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=%5Csqrt%7B2%7D는 상수이므로, 컴파일 타임에 결정되므로 크게 상관하지 않아도 좋다.
여기서 중요한것은 실질적으로 우리가 계산해야할 값은 http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=%5Csqrt%7B%5Calpha%7D라는 것이다.
k는 n을 2로 나눈값이므로 시프트 연산만으로 구현할 수 있기 때문이다.

http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=%5Csqrt%7B%5Calpha%7D를 어떻게 구할까?
이를 예견한것인지는 몰라도 뛰어난 수학자들이 몇 세기전에 좋은 해결방법을 만들어 놓았다.
그 이름은 바로 테일러 급수.

http://www.sitmo.com/gg/latex/latex2png.2.php?z=150&eq=%5Csqrt%7B1%20%2B%20x%7D%20%3D%201%20%2B%20%5Ctextstyle%20%5Cfrac%7B1%7D%7B2%7Dx%20-%20%5Cfrac%7B1%7D%7B8%7Dx%5E2%20%2B%20%5Cfrac%7B1%7D%7B16%7D%20x%5E3%20-%20%5Cfrac%7B5%7D%7B128%7D%20x%5E4%20%2B%20%5Cdots%5C!
단 ( |x| < 1 이어야한다.)
자세한 것은 위키백과 테일러 급수 참조

http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=%5Calpha%3D1%2Bx라고 하면 http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=0%5Cle%20x%3C1가 된다.
따라서 위 테일러 전개식의 수렴조건도 만족한다. 적당한 부분까지 테일러 전개식에 대입하여 http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=%5Csqrt%7B%5Calpha%7D를 구해내면된다.
게다가 부동소수점 데이터의 특성상 곧바로 x값을 구할수 있다.

더보기


그리고 위 식을
http://www.sitmo.com/gg/latex/latex2png.2.php?z=100&eq=1%2B%5Cfrac%7B1%7D%7B2%7Dx(1-%5Cfrac%7B1%7D%7B4%7Dx(1-%5Cfrac%7B1%7D%7B2%7Dx(1-%5Cfrac%7B5%7D%7B8%7Dx(%5Cldots))))
이렇게 묶어내면 연산횟수를 줄일 수 있다.

이 정도면 꽤 최적화된 제곱근 계산하는 함수를 구현할수 있을것이다
by 쿠리다쿠리 2010. 3. 23. 19:12
| 1 |