Determining Floating Point Square Root

后端 未结 4 1748
无人共我
无人共我 2021-01-05 05:46

How do I determine the square root of a floating point number? Is the Newton-Raphson method a good way? I have no hardware square root either. I also have no hardware divide

4条回答
  •  佛祖请我去吃肉
    2021-01-05 06:09

    Easiest to implement (you can even implement this in a calculator):

    def sqrt(x, TOL=0.000001):
        y=1.0
        while( abs(x/y -y) > TOL ):
            y= (y+x/y)/2.0
        return y
    

    This is exactly equal to newton raphson:

    y(new) = y - f(y)/f'(y)

    f(y) = y^2-x and f'(y) = 2y

    Substituting these values:

    y(new) = y - (y^2-x)/2y = (y^2+x)/2y = (y+x/y)/2

    If division is expensive you should consider: http://en.wikipedia.org/wiki/Shifting_nth-root_algorithm .

    Shifting algorithms:

    Let us assume you have two numbers a and b such that least significant digit (equal to 1) is larger than b and b has only one bit equal to (eg. a=1000 and b=10). Let s(b) = log_2(b) (which is just the location of bit valued 1 in b).

    Assume we already know the value of a^2. Now (a+b)^2 = a^2 + 2ab + b^2. a^2 is already known, 2ab: shift a by s(b)+1, b^2: shift b by s(b).

    Algorithm:

    Initialize a such that a has only one bit equal to one and a^2<= n < (2*a)^2. 
    Let q=s(a).    
    b=a
    sqra = a*a
    
    For i = q-1 to -10 (or whatever significance you want):
        b=b/2
        sqrab = sqra + 2ab + b^2
        if sqrab > n:
            continue
        sqra = sqrab
        a=a+b
    
    n=612
    a=10000 (16)
    
    sqra = 256
    
    Iteration 1:
        b=01000 (8) 
        sqrab = (a+b)^2 = 24^2 = 576
        sqrab < n => a=a+b = 24
    
    Iteration 2:
        b = 4
        sqrab = (a+b)^2 = 28^2 = 784
        sqrab > n => a=a
    
    Iteration 3:
        b = 2
        sqrab = (a+b)^2 = 26^2 = 676
        sqrab > n => a=a
    
    Iteration 4:
        b = 1
        sqrab = (a+b)^2 = 25^2 = 625
        sqrab > n => a=a
    
    Iteration 5:
        b = 0.5
        sqrab = (a+b)^2 = 24.5^2 = 600.25
        sqrab < n => a=a+b = 24.5
    
    Iteration 6:
        b = 0.25
        sqrab = (a+b)^2 = 24.75^2 = 612.5625
        sqrab < n => a=a
    
    
    Iteration 7:
        b = 0.125
        sqrab = (a+b)^2 = 24.625^2 = 606.390625
        sqrab < n => a=a+b = 24.625
    
    and so on.
    

提交回复
热议问题