Advertisement
  1. Code
  2. PHP

Trigonometría, Números Aleatorios y Más con las Funciones Incorporadas de PHP Math

Scroll to top
Read Time: 9 min

Spanish (Español) translation by Rene Soto (you can also view the original English article)

Las matemáticas básicas se usan mucho durante la programación. Necesitamos comparar, sumar, multiplicar, restar y dividir valores diferentes con frecuencia al escribir código.

A veces, las matemáticas requeridas en un programa pueden ser más complicadas. Es posible que deba trabajar con funciones logarítmicas, trigonométricas o exponenciales. En este tutorial, discutiré cómo usar cada una de estas funciones en PHP, con ejemplos.

Este tutorial te presentará las funciones matemáticas incorporadas en PHP para realizar cálculos de trigonometría, exponenciación y logaritmo. También veremos el redondeo y la generación de números aleatorios.

Funciones trigonométricas en PHP

Puede calcular el valor de seno, coseno y tangente de diferentes ángulos dados en radianes usando sin($ángle), cos($ángulo) y tan($ángulo). Todos devuelven valores flotantes, y la medida de ángulo que se les pasa está en radianes.

Esto significa que cuando simplemente calculas tan(45), no obtendrás 1 como salida, porque en realidad estarás calculando el valor de tangente a 45 radianes, que es aproximadamente 2,578 grados.  Afortunadamente, PHP tiene dos funciones muy útiles para convertir radianes a grados y viceversa. Estas funciones son rad2deg() y deg2rad(). Entonces, si realmente quiere calcular el valor de la tangente de 45 grados, tendrá que escribir tan(deg2rad(45)).

Cabe destacar que no hay una función PHP directa para calcular el valor de cosec(), sec() o cot(). Sin embargo, estos valores son solo recíprocos de sin(), cos() y tan(), por lo que aún puede calcular sus valores indirectamente.

También puedes hacer lo inverso y calcular el ángulo en el que un ángulo trigonométrico tiene un valor particular. Estas funciones se denominan asin(), acos() y atan(). Una cosa que debes recordar es que los valores de sin y cos nunca pueden ir más allá del rango de -1 a 1 para cualquier ángulo. Esto significa que asin() y acos() solo pueden aceptar valores en el rango de -1 a 1 como argumentos válidos. Un valor fuera de este rango le dará NaN.

La trigonometría tiene muchas aplicaciones, como determinar la trayectoria de un proyectil o las alturas y distancias de diferentes objetos, por lo que tener acceso a estas funciones es definitivamente útil si estás escribiendo un código que simule estas situaciones.

Estas funciones también son muy útiles cuando desea dibujar diferentes elementos utilizando valores radiales y angulares. Digamos que deseas dibujar un patrón de círculos alrededor de un círculo más grande a una distancia uniforme.  Si has leído el tutorial de PHP GD Shapes en Envato Tuts +, probablemente recuerdes que dibujar cualquier forma requerirá que pases coordenadas en forma de coordenadas x, y, pero dibujar patrones circulares es más fácil con coordenadas polares.

El uso de estas funciones trigonométricas en este caso te ayudará a dibujar las figuras deseadas utilizando sin() y cos() para convertir las coordenadas polares a la forma cartesiana. Aquí hay un ejemplo:

1
<?php
2
3
$image = imagecreatetruecolor(800, 600);
4
$bg = imagecolorallocate($image, 255, 255, 255);
5
imagefill($image, 0, 0, $bg);
6
7
$radius = 80;
8
9
for($i = 0; $i < 12; $i++) {
10
    $col_ellipse = imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200));
11
12
    imagefilledellipse($image, 175 + 125*cos(deg2rad($i*30)), 175 + 125*sin(deg2rad($i*30)), 3*$radius/4, 3*$radius/4, $col_ellipse);
13
    imageellipse($image, 175 + 125*cos(deg2rad($i*30)), 175 + 125*sin(deg2rad($i*30)), 3.5*$radius/4, 3.5*$radius/4, $col_ellipse);
14
15
    $col_ellipse = imagecolorallocate($image, rand(0, 200), rand(0, 200), rand(0, 200));
16
17
    imagefilledellipse($image, 575 + 150*cos(deg2rad($i*30)), 375 + 150*sin(deg2rad($i*30)), 3*$radius/4, 3*$radius/4, $col_ellipse);
18
    imageellipse($image, 575 + 150*cos(deg2rad($i*30)), 375 + 150*sin(deg2rad($i*30)), 3.5*$radius/4, 3.5*$radius/4, $col_ellipse);
19
}
20
21
$col_ellipse = imagecolorallocate($image, 255, 255, 255);
22
imagefilledellipse($image, 175, 175, 275, 275, $col_ellipse);
23
24
?>

La siguiente imagen muestra el resultado final del código PHP anterior.

Using PHP GD with Trigonometric functionsUsing PHP GD with Trigonometric functionsUsing PHP GD with Trigonometric functions

Funciones Exponenciales y Logarítmicas

PHP también tiene algunas funciones exponenciales y logarítmicas. La función exp($value) devolverá la constante e elevada a la potencia del flotante $value. De manera similar, puede calcular el logaritmo de un número dado a cualquier base utilizando la función log($arg, $base).  Si se omite $base, el logaritmo se calculará utilizando la base natural e. Si desea calcular el logaritmo de un número en base 10, simplemente puede usar la función log10($arg).

Una función más que podrías encontrar útil es pow($base, $exp), que devuelve $base elevado a la potencia de $exp. Algunos de ustedes pueden preferir usar el operador **. La expresión $a ** $b dará el mismo resultado que pow($a, $b). Sin embargo, puedes obtener resultados incorrectos en ciertas situaciones con $a ** $b. Por ejemplo, -1 ** 0.5 le dará -1, que es incorrecto. Calcular la misma expresión usando pow(-1, 0.5) dará el valor correcto, NaN.

1
<?php
2
3
echo log(1000, M_E); // 6.9077552789821

4
echo log(1000); // 6.9077552789821

5
echo log(1000, 10); // 3

6
echo log10(1000); // 3

7
8
echo pow(121, -121); // 9.6154627930786E-253

9
echo pow(121, 121); // 1.0399915443694E+252

10
echo pow(121, 1331); // INF

11
12
?>

Otras Funciones Matemáticas Útiles

Redondear Numeros

También hay muchas otras funciones matemáticas importantes. Puede redondear fracciones o números decimales hasta el entero más cercano usando la función ceil(float $value).  Esto convertirá tanto 2.1 como 2.9 a 3. De manera similar, puede redondear fracciones o números decimales al entero más cercano usando la función floor(float $value). Cambiará tanto 2.1 como 2.9 a 2.

Estas funciones son buenas para redondear fácilmente los resultados de diferentes cálculos. Digamos que necesitas saber cuántas personas puede acomodar una sala según su área. Su respuesta final después de la división probablemente será un número decimal, pero no puede dividir a las personas en fracciones, por lo que la respuesta correcta sería el valor mínimo del valor calculado.

A menudo querrás redondear un número hacia arriba o hacia abajo al entero más cercano. Por ejemplo, es posible que desee cambiar 2.1 a 2, pero 2.9 a 3. Esto se puede hacer fácilmente mediante la función round($value, $precisión, $mode). El parámetro $precision determina el número de decimales a los que redondear. El valor predeterminado de 0 simplemente devolverá números enteros. El tercer parámetro de $mode se usa para determinar qué sucede si el número que desea redondear se encuentra exactamente en el medio. Puedes usarlo para especificar si 3.5 debe cambiarse a 3 o 4.

Mínimo y Máximo

PHP también tiene dos funciones llamadas min($values) y max($values) para ayudarlo a determinar los valores más bajos y más altos en un conjunto o conjunto de números. Estas funciones pueden aceptar diferentes tipos de parámetros, como dos matrices y una cadena. Debes echar un vistazo a la documentación para ver cómo se compararán. 

1
<?php
2
3
$hall_width = 120;
4
$hall_length = 180;
5
$per_person_area = 35;
6
7
$hall_capacity = floor($hall_length*$hall_length/$per_person_area);
8
9
// Output: The hall can only accommodate 925 people.

10
echo 'The hall can only accommodate '.$hall_capacity.' people.';
11
12
$water_tank_volume = 548733;
13
$bucket_volume = 305;
14
15
$buckets_needed = ceil($water_tank_volume/$bucket_volume);
16
17
// Output: We will need 1800 buckets of water to completely fill the tank.

18
echo 'We will need '.$buckets_needed.' buckets of water to completely fill the tank.';
19
20
$marks = [49, 58, 93, 12, 30];
21
22
// Output: Minimum and maximum obtained marks in the exam are 12 and 93 respectively.

23
echo 'Minimum and maximum obtained marks in the exam are '.min($marks).' and '.max($marks).' respectively.';
24
?>

División Entera

También puede realizar una división de enteros en PHP usando la función intdiv($dividend, $divisor). En este caso, solo se devuelve la parte integral del cociente después de una división. De manera similar, también puede obtener el resto o el módulo después de la división de dos argumentos utilizando la función fmod($dividend, $divisor). El valor devuelto siempre será menor que el $divisor en magnitud.

Existen otras funciones útiles como is_nan($value), is_finite($value) e is_infinite($val) que se pueden usar para determinar si el valor es un número y, si es un número, si es finito o infinito . Recuerda que PHP considera que cualquier valor que sea demasiado grande para caber en una flotación es infinito. Así que is_finite() devolverá true para 100 factorial pero false para 1000 factorial.

Generando Números Aleatorios en PHP

Los números aleatorios resultan ser bastante útiles en una serie de situaciones. Puedes usarlos para generar datos "aleatorios" para tu aplicación o para generar instancias enemigas en juegos, etc. Es muy importante recordar que ninguna de las funciones que analizamos en esta sección genera números aleatorios criptográficamente seguros. Estas funciones solo deben utilizarse en situaciones donde la seguridad no es un problema, como mostrar textos de saludo aleatorios para repetir visitas o generar datos estadísticos aleatorios.

Las funciones rand($min, $max) y mt_rand($min, $max) pueden generar enteros aleatorios positivos entre los valores dados, incluidos los valores de $min y $max. Cuando las funciones se llaman sin ningún parámetro, generan números aleatorios entre 0 y getrandmax(). Puedes hacer echo al valor de getrandmax() para ver el número aleatorio máximo posible que estas funciones pueden generar en tu plataforma.

La función mt_rand() es 4 veces más rápida que rand() y devuelve false si $max es menor que $min. A partir de PHP 7.1.0, rand() se ha convertido en un alias de mt_rand(). La única diferencia es que rand() aún no da un error si $max es menor que $min para mantener la compatibilidad con versiones anteriores.

Aquí hay un bucle para generar valores aleatorios entre 0 y 100 un millón de veces. Como puedes ver, los valores 0, 50 y 100 se generan aproximadamente 10,000 veces con ligeras fluctuaciones.

1
<?php
2
3
$rand_values = [];
4
$sum = 0;
5
$count = 1000000;
6
7
for($i = 0; $i < $count; $i++) {
8
    $rand_values[$i] = mt_rand(0, 100);
9
    $sum += $rand_values[$i];
10
}
11
12
$count_frequency = array_count_values($rand_values);
13
14
// Output: 100 was randomly generated 9969 times.

15
echo '100 was randomly generated '.$count_frequency[100].' times.';
16
17
// Output: 50 was randomly generated: 9994 times.

18
echo '50 was randomly generated: '.$count_frequency[50].' times.';
19
20
// Output: 0 was randomly generated: 10010 times.

21
echo '0 was randomly generated: '.$count_frequency[0].' times.';
22
23
// Output: Average of random values: 49.97295

24
echo 'Average of random values: '.($sum/$count);
25
26
?>

Ambas funciones también tienen sus propias funciones de sembradora llamadas srand() y mt_srand() para proporcionar una semilla para los generadores de números aleatorios.  Debe tener en cuenta que solo llama a srand() y mt_srand() una vez en su programa. Llamarlos antes de cada llamada a rand() y mt_rand() te dará los mismos números "aleatorios" cada vez.

1
<?php
2
3
srand(215);
4
echo rand()."\n"; // 330544099

5
srand(215);
6
echo rand()."\n"; // 330544099

7
srand(215);
8
echo rand()."\n"; // 330544099

9
echo rand()."\n"; // 138190029

10
echo rand()."\n"; // 1051333090

11
echo rand()."\n"; // 1219572487

12
13
?>

Conclusiones Finales

PHP viene con muchas funciones integradas que deben satisfacer todas tus necesidades diarias de computación. Puede utilizar estas funciones para realizar cálculos un poco más complicados, como GCD, LCM y factoriales.

Hay solo un par de cosas que debes recordar al usar estas funciones. Por ejemplo, el valor devuelto por funciones como floor() y ceil() es un entero, pero sigue siendo un flotante. De manera similar, todas las funciones trigonométricas esperan que sus ángulos se den en radianes. Obtendrás resultados incorrectos si les pasas un valor de ángulo que deseas que se le trate como una medida de grado. Así que asegúrate de verificar el valor de retorno y los argumentos esperados de todas estas funciones en la documentación.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.