2011年11月6日 星期日

自己寫sqrt()


原理來自下面這個連結,為了怕以後來源掛掉所以這裡留一下他大概的內容
http://blog.sina.com.cn/s/blog_3fe235d70100lb6e.html
後來我發現它的原理其實就是用牛頓插值法求x^2 - n = 0

(X*X+A)/(2*X)=X
其中X是開方數,A是被開方數
隨意代入一個X值就會得到更精確的X值
例如將7開平方:
(1*1+7)/(2*1)=4
(4*4+7)/(2*4)=2.875
(2.875*2.875+7)/(2*2.875)=2.654189……
(2.65*2.65+7)/(2*2.65)=2.645754……
7的開方數: 2.64575131106……





實作的Code (C):

double sqr(double n)
{
    double x, y = 1;

    do {
        x = y;
        y = (x*x + n) / (2*x);
    } while ((y > x && y - x > ACCURACY) || (x > y && x - y > ACCURACY));

    return y;
}

沒有留言:

張貼留言