<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">"""
A module to show while-loops and numerical computations.

This is one of the most powerful uses of a while loop: using it to run
a computation until it converges.  There are a lot of algorithms from
Calculus and Numerical Analysis that work this way.

Author: Walker M. White (wmw2)
Date:   November 1, 2017 (Python 3 Version)
"""


def sqrt(c,err=1e-6):
    """
    Returns: the square root of c to with the given margin of error.
    
    We use Newton's Method to find the root of the polynomial f(x) = x^2-c
    
    Newton's Method produces a sequence where
    
        x_(n+1) = x_n - f(x_n)/f'(x_n) = x_n - (x_n*x_n-c)/(2x_n)
    
    which we simplify to
    
        x_(n+1) = x_n/2 + c/2 x_n
    
    We can stop this process and use x_n as an approximation of the square root
    of c.  The error when we do this is less than |x_n*x_n - c|.  So we loop
    until this error is less than err.
    
    Parameter c: The number to compute square root
    Precondition: c &gt;= 0 is a number
    
    Parameter err: The margin of error (OPTIONAL: default is e-6)
    Precondition: err &gt; 0 is a number
    """
    x = c/2.0
    
    while abs(x*x-c) &gt; err:
        # Compute next in Newton's Method sequence
        x = x/2.0+c/(2.0*x)
    
    return x


def pi(err):
    """
    Returns: the constant pi to with the given margin of error.
    
    We use the Power Series pi = 4(1 - 1/3 + 1/5 - 1/7 + ... + (-1 ** n)/(2n+1) + ...)
    
    We can approximate pi ~ 4(1 - 1/3 + 1/5 - 1/7 + ... + (-1 ** n)/(2n+1))
    In other words, we stop the infinite sum at some value of n.  The error when we 
    do this is &lt; 4/(2n+1). So we loop until we reach a value of n with 4/(2n+1) &lt;= error.
    
    Parameter err: The margin of error
    Precondition: err &gt; 0 is a number.
    """
    value = 4       # The value of pi start with n = 0
    
    power = -1      # Alternate between 1 and -1
    n = 1           # The next value of n
    while 4.0/(2*n+1) &gt; err:
        factor = (4.0*power)/(2*n+1)    # 4(-1 ** n)/(2n+1)
        value = value + factor          # Add factor
        power = -power
        n = n + 1
    
    return value
</pre></body></html>