Saltar al contenido principal

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.

Captura del módulo Math de JARU para cálculos numéricos, vectores y funciones matemáticas

use Math

Las funciones se llaman con el punto: Math.sqrt(9). Funcionan igual en Windows y en todas las placas.

Funciones​

FunciónQué haceDevuelve
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ámetroQué es
matrizUn array con los 9 números de la matriz, fila a fila: var m[3][3], o un array de 9 elementos.
puntosUn 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​

ConstanteQué esLo que escribe println
Math.PIEl número π3.141592653589793
Math.EEl número e2.718281828459045
Math.LOG2EEl logaritmo en base 2 de e1.4426950408889634
Math.LOG10EEl logaritmo en base 10 de e0.4342944819032518
Math.SQRT2La raíz cuadrada de 21.4142135623730951
Math.LN2El logaritmo neperiano de 20.6931471805599453
Math.LN10El logaritmo neperiano de 102.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, sqrt y pow siempre devuelven un decimal, también con enteros. Un decimal no vale como índice de una lista (ERR_TYPE_MISMATCH): pásalo a entero con int().
  • 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) escribe 0.49999999999999994. Para enseñarlos, redondéalos.
  • rotateBatch pide arrays, no listas.
  • Faltan asin, acos, atan, atan2, exp y log.

Todos los problemas conocidos de JARU, juntos, están en Problemas conocidos.