NAME
    cmp - compare two values

SYNOPSIS
    cmp(x, y)

TYPES
    If x is an object of type xx or x is not an object and y is an object
	of type xx, the funcion xx_cmp has to have been defined; any
	further conditions on x and y, and the type of the returned
	value depends on the definition of xx_cmp.

    For non-object x and y:

    x		number or string
    y		same as x

    return	-1, 0, 1					(real & string)
    		-1, 0, 1, -1+1i, 1i, 1+1i, -1-1i, -1i or 1-1i	(complex)

DESCRIPTION
    Compare two values and return a value based on their relationship.
    Comparison by type is indicated below.  Where more than one test is
    indicated, tests are performed in the order listed.  If the test is
    inconclusive, the next test is performed.  If all tests are
    inconclusive, the values are considered equivalent.

    real	(returns -1, 0, or 1)
	the greater number is greater

    complex	(returns -1, 0, 1, -1+1i, 1i, 1+1i, -1-1i, -1i or 1-1i)
	sgn(re(x) - re(y)) + sgn(im(x) - im(y)) * 1i

    string	(returns -1, 0, or 1)
	the string with the greater first different character is greater
	the longer string is greater

    object	(depends on xx_cmp)
	the greater object as defined by xx_cmp is greater

    String comparison is performed via the strcmp() libc function.

    Note that this function is not a substitution for equality.  The ==
    operator always takes epsilon() into account when comparing numeric
    values.  For example:

	> cmp(1, 1+epsilon()/2)
		-1
	> 1 == 1+epsilon()/2
		0

    It should be noted epsilon() is used when comparing complex values.

    Properties of cmp(a,b) for real or complex a and b are:

	cmp(a + c, b + c) = cmp(a,b)

	cmp(a, b) == 0 if and only if a == b

	cmp(b, a) = -cmp(a,b)

	if c is real or pure imaginary, cmp(c * a, c * b) = c * cmp(a,b)

	cmp(a,b) == cmp(b,c) if and only if b is "between" a and c

    The numbers between 2 + 3i and 4 + 5i are those with real part between
    2 and 4, imaginary part between 3 and 5; the numbers between 2 + 3i
    and 4 + 3i are those with real part between 2 and 4, imaginary part = 3.

EXAMPLE
    > print cmp(3,4), cmp(4,3), cmp(4,4), cmp("a","b"), cmp("abcd","abc")
    -1 1 0 -1 1

    > print cmp(3,4i), cmp(4,4i), cmp(5,4i), cmp(-5,4i), cmp(-4i,5), cmp(-4i,-5)
    1-1i 1-1i 1-1i -1-1i -1-1i 1-1i

    > print cmp(3i,4i), cmp(4i,4i), cmp(5i,4i), cmp(3+4i,5), cmp(3+4i,-5)
    -1i 0 1i -1+1i 1+1i

    > print cmp(3+4i,3+4i), cmp(3+4i,3-4i), cmp(3+4i,2+3i), cmp(3+4i,-4-5i)
    0 1i 1+1i 1+1i

LIMITS
     none

LIBRARY
    BOOL comparevalue(VALUE *y, *y)	(any, return TRUE if they differ)
    FLAG relvalue(VALUE *x, *y, *res)	(real, complex, string, object)

SEE ALSO
    abs, epsilon, sgn
