Módulo Math
El módulo Math reúne las funciones matemáticas: valor absoluto, redondeos, raíz cuadrada, potencia, mínimo, máximo y media, signo, seno, coseno y tangente, y un giro 3D de muchos puntos a la vez. También trae las constantes más usadas, como Math.PI.

use Math
Las funciones se llaman con el punto: Math.sqrt(9). Funcionan igual en Windows y en todas las placas.
Funciones
| Función | Qué hace | Devuelve |
|---|---|---|
abs(x) | El valor absoluto. | Un entero con un entero; un decimal con un decimal |
ceil(x) | Redondea hacia arriba. | Un entero |
floor(x) | Redondea hacia abajo. | Un entero |
round(x) | Redondea al más cercano. | Un entero con un entero; un decimal con un decimal |
sqrt(x) | La raíz cuadrada. | Un decimal |
pow(base, exponente) | La potencia. | Un decimal |
max(...) | El mayor de unos números. | Un decimal |
min(...) | El menor de unos números. | Un decimal |
average(...) | La media de unos números. | Un decimal |
sign(x) | El signo: -1, 0 o 1. | Un entero |
signCopy(x, y) | El valor absoluto de x con el signo de y. | Un decimal |
sin(x), cos(x), tan(x) | Seno, coseno y tangente, en radianes. | Un decimal |
rotateBatch(matriz, puntos) | Gira muchos puntos 3D con una matriz. | nil |
Los argumentos pueden ser enteros o decimales. Los errores se lanzan, así que se capturan con try:
- con un número de argumentos que no es el suyo,
ERR_INVALID_ARG_NUMBER; - con algo que no es un número,
ERR_TYPE_MISMATCH.
Un decimal sin parte decimal se escribe sin ella: Math.round(3.6) escribe 4, pero es un decimal.
abs
abs(x) devuelve el valor absoluto de un número: el número sin su signo. Con un entero devuelve un entero, y con un decimal, un decimal.
use Math
println(Math.abs(-5)) // 5
println(Math.abs(-2.5)) // 2.5
println(Math.abs(0)) // 0
ceil
ceil(x) redondea hacia arriba: devuelve el menor entero que no es menor que x. Siempre devuelve un entero.
use Math
println(Math.ceil(3.14159)) // 4
println(Math.ceil(-3.14159)) // -3
floor
floor(x) redondea hacia abajo: devuelve el mayor entero que no es mayor que x. Siempre devuelve un entero.
use Math
println(Math.floor(4.9)) // 4
println(Math.floor(4.1)) // 4
println(Math.floor(-4.1)) // -5
round
round(x) redondea al entero más cercano; las mitades, hacia fuera del cero. Con un entero devuelve un entero, y con un decimal, un decimal. Admite un solo argumento: no redondea a unos decimales.
use Math
println(Math.round(3.14159)) // 3
println(Math.round(3.6)) // 4
println(Math.round(2.5)) // 3
println(Math.round(-2.5)) // -3
Si lo necesitas como entero (por ejemplo, para un índice), usa Math.floor, Math.ceil o int().
sqrt
sqrt(x) devuelve la raíz cuadrada, en un decimal. Con un número negativo lanza ERR_INVALID_VALUE.
use Math
println(Math.sqrt(16)) // 4
println(Math.sqrt(2.25)) // 1.5
pow
pow(base, exponente) devuelve base elevado a exponente, en un decimal. El exponente puede ser decimal o negativo.
use Math
println(Math.pow(2, 10)) // 1024
println(Math.pow(9, 0.5)) // 3
println(Math.pow(2, -1)) // 0.5
max
max(...) devuelve el mayor de los números que le das, en un decimal. Acepta varios números o una lista. Sin argumentos, o con una lista vacía, devuelve 0.
use Math
println(Math.max(3, 7, 2)) // 7
println(Math.max([3, 7.5, 2])) // 7.5
Un elemento que no es un número lanza ERR_TYPE_MISMATCH.
min
min(...) devuelve el menor de los números que le das, en un decimal. Funciona como max().
use Math
println(Math.min(3, 7, 2)) // 2
average
average(...) devuelve la media de los números que le das, en un decimal. Acepta varios números o una lista. Sin argumentos, o con una lista vacía, devuelve 0.
use Math
var notas = [1, 2, 3, 4, 5]
println(Math.average(notas)) // 3
println(Math.average(1, 2)) // 1.5
sign
sign(x) devuelve el signo de un número: -1 si es negativo, 1 si es positivo y 0 si es cero. Siempre devuelve un entero.
use Math
println(Math.sign(-7)) // -1
println(Math.sign(0.5)) // 1
println(Math.sign(0)) // 0
signCopy
signCopy(x, y) devuelve el valor absoluto de x con el signo de y, en un decimal. Si y es negativo, el resultado es negativo; si no (también con 0), positivo.
use Math
println(Math.signCopy(5, -1)) // -5
println(Math.signCopy(-3.5, 2)) // 3.5
sin, cos y tan
sin(x), cos(x) y tan(x) devuelven el seno, el coseno y la tangente de un ángulo en radianes, en un decimal. Para pasar de grados a radianes, multiplica por PI y divide entre 180.
use Math
println(Math.cos(0)) // 1
println(Math.sin(Math.PI / 2)) // 1
var grados = 30
println(Math.sin(grados * Math.PI / 180)) // 0.49999999999999994
No hay más funciones trigonométricas: ni asin, acos, atan ni atan2, ni logaritmos ni exponencial.
rotateBatch
rotateBatch(matriz, puntos) multiplica muchos puntos 3D por una matriz de giro de 3 x 3, todos de una vez y mucho más deprisa que con un bucle de JARU. Cambia los puntos en su sitio y devuelve nil.
| Parámetro | Qué es |
|---|---|
matriz | Un array con los 9 números de la matriz, fila a fila: var m[3][3], o un array de 9 elementos. |
puntos | Un array de 3 filas y N columnas: var p[3][N]. La fila 0 son las X, la 1 las Y y la 2 las Z. Gira las N columnas. |
Tienen que ser arrays, no listas. Si matriz tiene menos de 9 elementos, o puntos no tiene 2 dimensiones con al menos 3 filas, lanza ERR_INVALID_VALUE. Después del giro, todos los puntos son decimales.
use Math
// Giro de 90 grados alrededor del eje Z
var c = Math.cos(PI / 2)
var s = Math.sin(PI / 2)
var m[3][3]
m[0][0] = c
m[0][1] = 0 - s
m[0][2] = 0
m[1][0] = s
m[1][1] = c
m[1][2] = 0
m[2][0] = 0
m[2][1] = 0
m[2][2] = 1
// Dos puntos: (10, 0, 5) y (0, 20, 0)
var p[3][2]
p[0][0] = 10
p[1][0] = 0
p[2][0] = 5
p[0][1] = 0
p[1][1] = 20
p[2][1] = 0
Math.rotateBatch(m, p)
for (var i = 0; i < 2; i++)
println(Math.round(p[0][i]), ", ", Math.round(p[1][i]), ", ", Math.round(p[2][i]))
end
Lo que escribe:
0, 10, 5
-20, 0, 0
El ejemplo VectorBalls, que trae JARU IDE, lo usa para girar figuras de 100 bolas en cada fotograma.
Constantes
| Constante | Qué es | Lo que escribe println |
|---|---|---|
Math.PI | El número π | 3.141592653589793 |
Math.E | El número e | 2.718281828459045 |
Math.LOG2E | El logaritmo en base 2 de e | 1.4426950408889634 |
Math.LOG10E | El logaritmo en base 10 de e | 0.4342944819032518 |
Math.SQRT2 | La raíz cuadrada de 2 | 1.4142135623730951 |
Math.LN2 | El logaritmo neperiano de 2 | 0.6931471805599453 |
Math.LN10 | El logaritmo neperiano de 10 | 2.302585092994046 |
PI y SQRT2 son también constantes del lenguaje: se pueden usar sin Math. y sin use Math, con el mismo valor.
println(PI) // 3.141592653589793
println(SQRT2) // 1.4142135623730951
Ejemplo completo
Hasta dónde llega un disparo a 20 m/s según el ángulo, y con qué ángulo llega más lejos.
use Math
const VELOCIDAD = 20 // metros por segundo
const GRAVEDAD = 9.8
func alcance(grados)
var angulo = grados * PI / 180 // a radianes
return Math.pow(VELOCIDAD, 2) * Math.sin(2 * angulo) / GRAVEDAD
end
var angulos = [15, 30, 45, 60, 75]
var mejor = 0
var mejorAngulo = 0
foreach (var g in angulos)
var r = alcance(g)
println(g, " grados: ", Math.round(r), " m")
if (r > mejor) then
mejor = r
mejorAngulo = g
end
end
println("El que más llega: ", mejorAngulo, " grados")
Lo que escribe:
15 grados: 20 m
30 grados: 35 m
45 grados: 41 m
60 grados: 35 m
75 grados: 20 m
El que más llega: 45 grados
Trampas y problemas conocidos
- Los ángulos van en radianes, no en grados:
grados * PI / 180. max,min,average,sqrtypowsiempre devuelven un decimal, también con enteros. Un decimal no vale como índice de una lista (ERR_TYPE_MISMATCH): pásalo a entero conint().round()con un decimal devuelve un decimal, y las mitades van hacia fuera:Math.round(-2.5)da -3.- Los decimales se escriben con todas sus cifras:
Math.sin(30 * PI / 180)escribe0.49999999999999994. Para enseñarlos, redondéalos. rotateBatchpide arrays, no listas.- Faltan
asin,acos,atan,atan2,expylog.
Todos los problemas conocidos de JARU, juntos, están en Problemas conocidos.