NAME
    sqrt - evaluate exactly or approximate a square root

SYNOPSIS
    sqrt(x [, eps[, z]])

TYPES
    If x is an object of type tt, or if x is not an object but y
    is an object of type tt, and the user-defined function
    tt_round has been defined, the types for x, y, z are as
    required for tt_round, the value returned, if any, is as
    specified in tt_round.  For object x or y, z defaults to a
    null value.

    For other argument types:

    x           real or complex
    eps         0 < real < 1, defaults to epsilon()
    z           integer

    return      real or complex

DESCRIPTION
    For real or complex x, sqrt(x, y, z) returns either the exact
    value of a square root of x (which is possible only if this
    square root is rational) or a number for which the real and
    imaginary parts are either exact or the nearest below or nearest
    above to the exact values.

    The argument, eps, specifies the epsilon/error value to be
    used during calculations.  By default, this value is epsilon().

    The seven lowest bits of z are used to control the signs of the
    result and the type of any rounding:

    z bit 6    ((z & 64) > 0)

        0:      principal square root

        1:      negative principal square root

    z bit 5    ((z & 32) > 0)

        0:      return an approximation square root

        1:      return exact square root when real & imaginary are rational

    z bits 5-0  (z & 31)

        0:      round down or up according as y is positive or negative,
                sgn(r) = sgn(y)

        1:      round up or down according as y is positive or negative,
                sgn(r) = -sgn(y)

        2:      round towards zero, sgn(r) = sgn(x)

        3:      round away from zero, sgn(r) = -sgn(x)

        4:      round down

        5:      round up

        6:      round towards or from zero according as y is positive or
                negative, sgn(r) = sgn(x/y)

        7:      round from or towards zero according as y is positive or
                negative, sgn(r) = -sgn(x/y)

        8:      a/y is even

        9:      a/y is odd

        10:     a/y is even or odd according as x/y is positive or negative

        11:     a/y is odd or even according as x/y is positive or negative

        12:     a/y is even or odd according as y is positive or negative

        13:     a/y is odd or even according as y is positive or negative

        14:     a/y is even or odd according as x is positive or negative

        15:     a/y is odd or even according as x is positive or negative

    The value of y and lowest 5 bits of z are used in the same way as
    y and z in appr(x, y, z): for either the real or imaginary part
    of the square root, if this is a multiple of y, it is returned
    exactly; otherwise the value returned for the part is the
    multiple of y nearest below or nearest above the true value.
    For z = 0, the remainder has the sign of y;  changing bit 0
    changes to the other possibility; for z = 2, the remainder has the
    sign of the true value, i.e. the rounding is towards zero; for
    z = 4, the remainder is always positive, i.e. the rounding is down;
    for z = 8, the rounding is to the nearest even multiple of y;
    if 16 <= z < 32, the rounding is to the nearest multiple of y when
    this is uniquely determined and otherwise is as if z were replaced
    by z - 16.

    With the initial default values, 1e-20 for epsilon() and 24 for
    config("sqrt"), sqrt(x) returns the principal square root with
    real and imaginary parts rounded to 20 decimal places, the 20th
    decimal digit being even when the part differs from a multiple
    of 1e-20 by 1/2 * 1e-20.

EXAMPLE
    ; eps = 1e-4
    ; print sqrt(4,eps,0), sqrt(4,eps,64), sqrt(8i,eps,0), sqrt(8i, eps, 64)
    2 -2 2+2i -2-2i

    ; print sqrt(2,eps,0), sqrt(2,eps,1), sqrt(2,eps,24)
    1.4142 1.4143 1.4142

    ; x = 1.2345678^2
    ; print sqrt(x,eps,24), sqrt(x,eps,32), sqrt(x,eps,96)
    1.2346 1.2345678 -1.2345678

    ; print sqrt(.00005^2, eps, 24), sqrt(.00015^2, eps, 24)
    0 0.0002

LIMITS
    0 < eps < 1

LINK LIBRARY
    COMPLEX *c_sqrt(COMPLEX *x, NUMBER *ep, long z)
    NUMBER *qisqrt(NUMBER *q)
    NUMBER *qsqrt(NUMBER *x, NUMBER *ep, long z)
    FLAG zsqrt(ZVALUE x, ZVALUE *result, long z)

SEE ALSO
   appr, epsilon

## Copyright (C) 1999,2021,2023  Landon Curt Noll
##
## Calc is open software; you can redistribute it and/or modify it under
## the terms of the version 2.1 of the GNU Lesser General Public License
## as published by the Free Software Foundation.
##
## Calc is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
## or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General
## Public License for more details.
##
## A copy of version 2.1 of the GNU Lesser General Public License is
## distributed with calc under the filename COPYING-LGPL.  You should have
## received a copy with calc; if not, write to Free Software Foundation, Inc.
## 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
##
## Under source code control:   1995/09/18 03:54:32
## File existed as early as:    1995
##
## chongo <was here> /\oo/\     http://www.isthe.com/chongo/
## Share and enjoy!  :-)        http://www.isthe.com/chongo/tech/comp/calc/
