The math package
The math package piggybacks on libc for basic mathematical operations with standard integer and floating point types.
By simply importing
math, a most of the math functions from libc will get
Often, math operations are available both in function form and in method form. The function form would be similar to C, e.g.:
sin(2 * PI)
Whereas the method form would be more.. object-oriented-ish:
Powers and roots
pow elevates the first argument to the power of the second:
2 pow(8) // 256
exp returns the value of e (the base of natural logarithms) raised to the
power of x:
exp(2) // approx. 7.389
sqrt returns the square root of a number:
144 sqrt() // 12
cbrt returns the cube root of a number:
8 cbrt() // 2
PI is a constant defined in math as:
PI := 3.14159_26535_89793_23846_26433_83279
tan, are available, both in method and function form:
sin(2 * PI) // 0 cos(- (3 / 4) * PI) // -0.707, etc. tan(PI / 4) // 1
As are their arc equivalents,
atan, their hyperbolic
tanh, and their arc hyperbolic tandems,
atan2, straight from Wikipedia:
In a variety of computer languages, the function atan2 is the arctangent function with two arguments. The purpose of using two arguments instead of one, is to gather information of the signs of the inputs in order to return the appropriate quadrant of the computed angle, which is not possible for the single-argument arctangent function. For any real number (e.g., floating point) arguments x and y not both equal to zero, atan2(y, x) is the angle in radians between the positive x-axis of a plane and the point given by the coordinates (x, y) on it. The angle is positive for counter-clockwise angles (upper half-plane, y > 0), and negative for clockwise angles (lower half-plane, y < 0).
log function returns the natural logarithm of x:
log(2) // about 0.69
log10 function returns the base 10 logarithm of x:
log10(4000) // about 3.6
Rounding and truncation
roundLLong are methods that will round to the
3.14 round() // 3.00 4.78 roundLong() // 5 0.92 roundLLong() // 1
floor methods will round to the nearest upper and lower
3.14 ceil() // 4.00 8.92 floor() // 8.00
mod function computes the floating-point remainder of dividing x by y.
The return value is x - n * y, where n is the quotient of x / y, rounded toward
zero to an integer.
12 mod(5) // 2
To get the absolute value of a number, use
(-4) abs() // 4
math/Random, one can generate random numbers.
Disclaimer: neither the libc random number generator or the fast prng exposed by math/Random are suitable for cryptographic usage. Find a library that does it right, this was not planned for it.
When the module is loaded (probably at program start-up), the libc random number generator will be seeded with the current time in microseconds.
Then, various functions can be used to get random numbers.
To get any number between
number := Random random()
To get any number within a range, use either:
// gives a number between 0 (included) and 10 (included) number := Random randInt(0, 10) // gives a number between 0 (included) and 9 (included) number = Random randRange(0, 10)
Those both have variants to get a number in a range, excluding any number already contained in a list:
// get 10 unique numbers between 0 and 100 list := ArrayList<Int> new() 10 times(|| list add(Random randInt(0, 100, list)) )
To pick out a random element ouf ot a list, use
// get one of those 10 unique numbers we just generated: num := Random choice(list)
choice is generic, so it will work with lists of any
type of element.
Most of the methods above have a
fast variant, working from a PRNG (pseudorandom
number generator) coded directly into the Random class.
// all these are documented above, they work in a similar fashion Random fastRandom() Random fastRandInt(0, 10) Random fastRandRange(0, 10) Random fastRandInt(0, 10, list) Random fastRandRange(0, 10, list) Random fastChoice(list)
fast variants are meant to be faster, as the name implies, but they’re even
less guaranteed to have good random qualities - the numbers it generates might be
less even / repeat more easily.