/js-numbers

Javascript implementation of Scheme's numeric tower

Primary LanguageJavaScriptOtherNOASSERTION

js-numbers: a Javascript implementation of Scheme's numeric tower

Developer:
    Danny Yoo (dyoo@cs.wpi.edu)

License:
    BSD

Summary: js-numbers implements the "numeric tower" commonly associated
with the Scheme language.  The operations in this package
automatically coerse between fixnums, bignums, rationals, floating
point, and complex numbers.


Contributors: I want to thank the following people:

    Zhe Zhang
    Ethan Cecchetti
    Ugur Cekmez


Other sources:
    The bignum implementation (content from jsbn.js and jsbn2.js) used
    in js-numbers comes from Tom Wu's JSBN library at:

    http://www-cs-students.stanford.edu/~tjw/jsbn/



======================================================================

WARNING WARNING

This package is currently being factored out of an existing project,
Moby-Scheme.  As such, the code here is in major flux, and this is
nowhere near ready from public consumption yet.  We're still in the
middle of migrating over the test cases from Moby-Scheme over to this
package, and furthermore, I'm taking the time to redo some of the
implementation.  So this is going to be buggy for a bit.  Use at your
own risk.


======================================================================
Examples



[fill me in]


======================================================================
API


Loading js-numbers.js will define a toplevel namespace called

    jsnums

which contains following constants and functions:



pi: scheme-number

e: scheme-number

nan: scheme-number
    Not-A-Number

inf: scheme-number
    infinity

negative_inf: scheme-number
    negative infinity

negative_zero: scheme-number
    The value -0.0.

zero: scheme-number

one: scheme-number

negative_one: scheme-number

i: scheme-number
    The square root of -1.

negative_i: scheme-number
    The negative of i.

fromString: string -> (scheme-number | false)
    Convert from a string to a scheme-number.  If we find the number is malformed,
    returns false.

fromFixnum: javascript-number -> scheme-number
    Convert from a javascript number to a scheme number.  If the
    number looks like an integer, represents as an exact integer.
    Otherwise, represents as a float.  If you need more precision over
    the representation, use makeFloat or makeRational instead.

makeRational: javascript-number javascript-number? -> scheme-number
    Low level constructor: Constructs a rational with the given
    numerator and denominator.  If only one argument is given, assumes
    the denominator is 1.  The numerator and denominator must be
    integers.

makeFloat: javascript-number -> scheme-number
    Low level constructor: constructs a floating-point number.

makeBignum: string -> scheme-number
    Low level constructor: constructs a bignum.

makeComplex: scheme-number scheme-number? -> scheme-number
    Constructs a complex number; the real and imaginary parts of the
    input must be basic scheme numbers (i.e. not complex).  If only one
    argument is given, assumes the imaginary part is 0.

makeComplexPolar: scheme-number scheme-number -> scheme-number
    Constructs a complex number; the radius and theta must be basic
    scheme numbers (i.e. not complex).

isSchemeNumber: any -> boolean
    Produces true if the thing is a scheme number.

isRational: scheme-number -> boolean
    Produces true if the number is rational.

isReal: scheme-number -> boolean
    Produces true if the number is a real.

isExact: scheme-number -> boolean
    Produces true if the number is being represented exactly.

isInexact: scheme-number -> boolean
    Produces true if the number is inexact.

isInteger: scheme-number -> boolean
    Produces true if the number is an integer.

toFixnum: scheme-number -> javascript-number
    Produces the javascript number closest in interpretation to the
    given scheme-number.

toExact: scheme-number -> scheme-number
    Converts the number to an exact scheme-number.

toInexact: scheme-number -> scheme-number
    Converts the number to an inexact scheme-number.

add: scheme-number scheme-number -> scheme-number
    Adds the two numbers together.

subtract: scheme-number scheme-number -> scheme-number
    Subtracts the first number from the second.

mulitply: scheme-number scheme-number -> scheme-number
    Multiplies the two numbers together.

divide: scheme-number scheme-number -> scheme-number
    Divides the first number by the second.

equals: scheme-number scheme-number -> boolean
    Produces true if the two numbers are equal.

eqv: scheme-number scheme-number -> boolean
    Produces true if the two numbers are equivalent.

approxEquals: scheme-number scheme-number scheme-number -> boolean
    Produces true if the two numbers are approximately equal, within the
    bounds of the third argument.

greaterThanOrEqual: scheme-number scheme-number -> boolean
    Produces true if the first number is greater than or equal to the second.

lessThanOrEqual: scheme-number scheme-number -> boolean
    Produces true if the first number is less than or equal to the second.

greaterThan: scheme-number scheme-number -> boolean
    Produces true if the first number is greater than the second.

lessThan: scheme-number scheme-number -> boolean
    Produces true if the first number is less than the second.

expt: scheme-number scheme-number -> scheme-number
    Produces the first number exponentiated to the second number.

exp: scheme-number -> scheme-number
    Produces e exponentiated to the given number.

modulo: scheme-number scheme-number -> scheme-number
    Produces the modulo of the two numbers.

numerator: scheme-number -> scheme-number
    Produces the numerator of the rational number.

denominator: scheme-number -> scheme-number
    Produces the denominator of the rational number.

quotient: scheme-number scheme-number -> scheme-number
    Produces the quotient.  Both inputs must be integers.

remainder: scheme-number scheme-number -> scheme-number
    Produces the remainder.  Both inputs must be integers.

sqrt: scheme-number -> scheme-number
    Produces the square root.

abs: scheme-number -> scheme-number
    Produces the absolute value.

floor: scheme-number -> scheme-number
    Produces the floor.

round: scheme-number -> scheme-number
    Produces the number rounded to the nearest integer.

ceiling: scheme-number -> scheme-number
    Produces the ceiling.

conjugate: scheme-number -> scheme-number
    Produces the complex conjugate.

magnitude: scheme-number -> scheme-number
    Produces the complex magnitude.

log: scheme-number -> scheme-number
    Produces the natural log (base e) of the given number.

angle: scheme-number -> scheme-number
    Produces the complex angle.

cos: scheme-number -> scheme-number
    Produces the cosine.

sin: scheme-number -> scheme-number
    Produces the sin.

tan: scheme-number -> scheme-number
    Produces the tangent.

asin: scheme-number -> scheme-number
    Produces the arc sine.

acos: scheme-number -> scheme-number
    Produces the arc cosine.

atan: scheme-number -> scheme-number
    Produces the arc tangent.

cosh: scheme-number -> scheme-number
    Produces the hyperbolic cosine.

sinh: scheme-number -> scheme-number
    Produces the hyperbolic sine.

realPart: scheme-number -> scheme-number
    Produces the real part of the complex number.

imaginaryPart: scheme-number -> scheme-number
    Produces the imaginary part of the complex number.

sqr: scheme-number -> scheme-number
    Produces the square.

integerSqrt: scheme-number -> scheme-number
    Produces the integer square root.

gcd: scheme-number [scheme-number ...] -> scheme-number
    Produces the greatest common divisor.

lcm: scheme-number [scheme-number ...] -> scheme-number
    Produces the least common mulitple.


toRepeatedDecimal: scheme-number scheme-number {limit: number}? -> [string, string, string]
    Produces a string representation of the decimal expansion; the first and second
    argument must be integers.  Returns an array of three parts: the portion before
    the decimal, the non-repeating part, and then the repeating part. 

    If the expansion goes beyond the limit (by default, 256 characters), then
    the expansion will be cut off, and the third portion will be '...'.


======================================================================
Test suite

Open tests/index.html, which should run our test suite over all the
public functions in js-numbers.

If you notice a good test case is missing, please let the developer
know, and we'll be happy to add it in.



======================================================================
TODO

* Absorb implementations of:

  atan2, cosh, sinh, sgn

* Add real documentation.


======================================================================

Related work

There appears to be another Scheme numeric tower implementation that
just came out in the last month or so, by Matt Might and John Tobey:

    https://github.com/jtobey/javascript-bignum
    http://silentmatt.com/biginteger/




======================================================================
History

February 2010: initial refactoring from the moby-scheme source tree.

June 2010: got implementation of integer-sqrt from Ugur Cekmez;
brought in some fixes from Ethan Cecchetti.