Ver la Versión Completa : [ ARTICULO ] Matemáticas en Tasker
Caravantes
16/03/13, 07:29:13
Lo que sigue es una traducción de las funciones matemáticas de Tasker, texto que aparece en inglés (en la guía para hispanohablantes :oh:) en http://tasker.dinglisch.net/userguide/es/maths.html
En mensajes siguientes, además de comentarios y dudas, podemos ir poniendo ejemplos de cómo usamos estas funciones matemáticas en nuestras tareas, para que todos podamos aprender de ello.
Hay dos funciones (expm1 y ulp) que no están bien explicadas en el texto original y que tal vez podáis ayudarme a entender. También agradeceré comentarios sobre cualquier otro error o traducción poco acertada.
-----------------------------------------
¿Dónde se utilizan matemáticas?
En la acción Establecer Variable activando la casilla Calcular.
Con la acción Si (If), si se selecciona una comparación matemática como < o =
Con las condiciones individuales de acción cuando se selecciona la comparación matemática.
Operadores
+ - * / - los operadores básicos
% - módulo
^ - Potencia
Constantes
E - la base de los logaritmos naturales
EUL - la constante de Euler
LN2 - log de base 2 e
LN10 - log base 10 de e
LOG2E - log de la base e 2
LOG10E - log de la base e 10
PHI - la proporción áurea
PI - la relación de la circunferencia de un círculo y su diámetro
Funciones
Las funciones toman su argumento entre paréntesis, por ejemplo sin(90)
abs - valor absoluto
acos - arco coseno, el ángulo devuelto se encuentra en el rango de 0,0 y pi
asin - arco seno, el ángulo devuelto está en el rango de-pi / 2 a través de pi / 2
atan - arco tangente; el ángulo devuelto está en el rango de-pi / 2 a través de pi / 2
cbrt - raíz cúbica
ceil - redondeo al alza: valor más pequeño que es mayor o igual al argumento y es un número entero
cos - coseno trigonométrico
cosh - coseno hiperbólico
exp – constante de Euler elevada a la potencia del valor
expm1 - ex-1 (nota 1 al pie)
floor – redondeo a la baja: valor más grande que es menor o igual al argumento y es un número entero
getExp - exponente imparcial utilizado en la representación del valor
log - logaritmo natural (base e)
log10 - logaritmo en base 10
log1p - logaritmo natural de (val +1)
nextup - valor de punto flotante adyacente al valor, en la dirección de infinito positivo
round – entero de 64 bits más cercano al argumento
roundhe - doble valor que está más cerca en valor para el argumento y es igual a un entero matemático, utilizando el método de redondeo medio de equilibrio.
signum – función signum del argumento; cero si el argumento es cero; 1.0 si el argumento es mayor que cero; -1.0 si el argumento es menor que cero
sin - seno trigonométrico
senh - seno hiperbólico
sqrt - raíz cuadrada (de números positivos)
tan - trigonométrica tangente
tanh - tangente hiperbólica
todeg - convierte un ángulo medido en radianes a un ángulo aproximadamente equivalente medido en grados
torad - convierte un ángulo medido en grados a un ángulo aproximadamente equivalente medido en radianes
ulp - tamaño de un "ulp" del algumento (Nota 2 al pie)
-----------------------------------------
Notas al pie.
(1) expm1 - Devuelve exp(numero)-1, calculado de tal forma que no pierde precisión incluso cuando el valor del número se aproxima a cero. Así se explica en páginas como http://phpmanuals.net/es/function.expm1.html
(2) ulp - En otras páginas dedicadas a temas similares, ULP se puede referir a “Unit in Last Position”, “Units in Last Place”, unidades en el último lugar, el dígito menos significativo, la diferencia entre el valor y otro valor inmediatamente superior que tuviera el mismo número de dígitos.
Caravantes
16/03/13, 08:29:21
Ahí va un primer ejemplo del uso de matemáticas
Establecer variable, %segundos a %TIMES - (100*floor(%TIMES/100))
La variable %TIMES es un número que indica los segundos. Pero es un número muy lago (10 dígitos) que indica los segundos transcurridos desde 1970, creo, y yo solo necesitaba dos dígitos, los últimos de esa serie de 10 dígitos. La fórmula siguiente extrae esos dos últimos dígitos y desprecia el resto.
%TIMES - (100*floor(%TIMES/100))
Más detalles sobre este asunto en el perfil y la tarea correspondientes, en
http://www.htcmania.com/showpost.php?p=7966146
Caravantes me interesa mucho lo de convertir la variable times a dos dígitos para la app que algún día acabaré...
Pero no entiendo eso de que pone de floor en la fórmula... ¿?
Por cierto flipe cuando efectivamente leí que esta calculada desde el año 1970! En fin...
Enviado desde mi GT-N7000 usando Tapatalk 2
Lukevalci
20/03/13, 23:41:03
Buenas, mlesir.
Lo que hace la tarea es lo que sigue. Te pongo los pasos que hace Tasker con un ejemplo práctico para que lo veas mejor.
1) floor(%TIMES/100)) ---> redondea a la baja al mayor número entero // Ej. 99999/100= 999,99 ---> 999
2) (100*floor(%TIMES/100)) ---> Multiplicamos por 100 el resultado de 1) ---> 99900
3) %TIMES - (100*floor(%TIMES/100)) ---> Restamos %TIMES al resultado de 2) ---> 99999 - 99900 = 99
Saludos,
Caravantes
21/03/13, 01:42:59
no entiendo eso de que pone de floor en la fórmula... ¿?
Tasker tiene dos funciones para redondear al entero más cercano.
floor (significa "suelo") hace un redondeo a la baja.
floor(12.34567) da como resultado 12 que es el valor entero inferior más cercano
ceil (significa "techo") hace un redondeo al alza.
ceil (12.34567) da como resultado 13 que es el valor entero superior más cercano
El resto de las funciones matemáticas se utilizan igual. Por ejemplo, abs(%cifra) devuelve el valor absoluto, o sea que da como resultado la misma cifra pero sin tener en cuenta un posible signo negativo. Eso significa que si la cifra original era negativa la devuelve como positiva, y si ya en origen era positiva la función abs devuelve la misma cifra.
Te explicaré poco a poco cómo he construido ese algoritmo de los segundos.
Poco a poco fui creando una tarea en la que fui agregando varias notificaciones. Ponía una notificación y probaba la tarea, luego añadía otra notificación con otra formula más compleja y volvía a ejecutar la tarea para comprobar la notificación, y así sucesivamente. Es un buen método para ir verificando que los cálculos avanzan correctamente.
1 Notificación %TIMES
Así comprobé que la variable %TIMES contiene una cifra del estilo siguiente: 1362966168
Ejecutando repetidamente esa acción vi que la cifra se incrementa cada segundo, o sea que representa un número de segundos a partir de un momento inicial. Se me ocurrió calcular ese momento inicial dividiendo esa cifra entre 60 para obtener el mismo dato en minutos; el resultado lo divido otra vez entre 60 para obtener horas; vuelvo a dividir entre 24 y entre 365 para obtener años, y el resultado final son 43.21937366818874, o sea 43 años y pico. Hace 43 años y pico era cuando comenzaba el año 1970, que es cuando parece ese contador comenzó a funcionar. Sigamos con la tarea y los cálculos.
2 Notificación %TIMES/100 da una cifra del estilo 13629661.68
3 Notificación floor(%TIMES/100) da 13629661 eliminando los decimales por redondeo a la baja
4 Notificación 100*floor(%TIMES/100) da 1362966100 pues pone dos ceros en el lugar que ocupaban los dos últimos digitos de la cifra original
5 Notificación %TIMES - (100*floor(%TIMES/100)) da como resultado 68 que son los dos dígitos buscados (1362966168 - 1362966100 = 68)
Este algoritmo devuelve una cifra de dos dígitos que parecen ser segundos pero hay que considerar una salvedad: esa cifra va aumentando hasta llegar a 99, luego pasa a 00 y luego vuelve a aumentar. Si utilizas la variable %TIME (que devuelve horas y minutos), y le añades el algoritmo citado, así
Notificación %TIME : %TIMES - (100*floor(%TIMES/100))
obtienes algo como 23:59 : 99
lo cual puede parecer muy extraño porque en ese formato de presentación el número de segundos jamás debería ser superior a 59. Y además podrá ocurrir que ese contador de segundos pase de 99 a 00 en un momento en el que las horas y los minutos no han cambiado. Lo cual significa que un resultado del tipo 23:59 : 99 puede ser cronológicamente anterior a otro resultado del tipo 23:59 : 00
Aún teniendo en cuenta todas estas consideraciones, puede merecer la pena usarlo de esta forma por lo sencillo y lo directo que resulta. En el perfil que yo estaba construyendo, lo que me interesaba era crear dos nombres de archivo diferentes para dos llamadas que se produjeran en el mismo minuto, y este sistema resolvía el problema de forma suficiente.
Otra posibilidad sería calcular los segundos reales tal como aparecen en un reloj digital. Es un poco más complejo pero no creo que sea difícil, así que voy a intentarlo. Tengamos en cuenta que
Una hora tiene (60*60) 3600 segundos.
Un día tiene (60*60*24) 86400 segundos.
Primero vamos a calcular el tiempo transcurrido desde que se inició el contador %TIMES, en días completos + horas completas + minutos completos.
1 Establecer variable %Segundos a %TIMES
2 Establecer variable %dias a floor(%Segundos/86400)
3 Establecer %Segundos a %Segundos - (%dias * 86400)
4 Establecer variable %horas a floor(%Segundos/3600)
5 Establecer %Segundos a %Segundos - (%horas * 3600)
6 Establecer variable %minutos a floor(%Segundos/60)
7 Establecer %Segundos a %Segundos - (%minutos* 60)
La tarea va calculando el número de días completos, horas completas y minutos completos (transcurridos desde que ese contador comenzó a funcionar), y tras cada uno de esos cálculos, en la variable %Segundos va quedando el resto que queda descontando el tiempo (días/horas/minutos) ya procesados. O sea que al final, en %Segundos tenemos los segundos reales, una cifra cuyo valor está entre 00 y 59 y que debería coincidir con los segundos que marcase un reloj digital. Las cifras de horas y minutos también deben coincidir con un reloj digital normal. Esta tarea podría ser independiente y funcionar como una subrrutina o subtarea, para ser llamada o lanzada desde otras tareas más importantes en las que ya no hay que preocuparse de estos cálculos pesados y tediosos: tras la ejecución de esta tarea, la variable %Segundos queda disponible para ser consultada o utilizada en cualquier otra tarea que necesite ese dato.
Todo esto lo estoy escribiendo aquí a bote-pronto, no lo he probado: si descubrís algún error os agradeceré que lo digáis. Y si alguien quiere aportar mejoras u otro tipo de cálculos, pues bienvenido.
Lukevalci
21/03/13, 15:31:15
Otra posibilidad sería calcular los segundos reales tal como aparecen en un reloj digital
Si lo que pretendemos es conocer los segundos aproximados, hay un procedimiento más sencillo:
1) Establecer variable %segundos a %TIMES - (100*floor(%TIMES/100))
2) Si %segundos = 60
2.1) Establecer variable %segundos a 00
3) Else Si %segundos > 60
3.1) Establecer variable %segundos a %segundos - 60
4) Else Si %segundos < 60
4.1) Detener
5) Fin si
Si ahora hacemos un Pop Up de %segundos nos mostrará el valor aproximado de los segundos en formato ''
Caravantes
21/03/13, 18:20:51
Otra posibilidad sería calcular los segundos reales tal como aparecen en un reloj digital.
Me he dado cuenta de que, si lo que pretendemos es conocer solo los segundos, hay un procedimiento mucho más sencillo:
1 Establecer variable %segundos a %TIMES - (60*floor(%TIMES/60)) , calcular
Eso es todo.
Asunto resuelto con la misma simplicidad que mi algoritmo inicial, solo ha habido que cambiar los cienes por sesentas.
Matemáticamente es correcto pero no siempre coincide con los segundos de un reloj digital. Puede que la cifra resultante sea menor de 10 y los segundos de un reloj digital siempre tienen dos dígitos; en ese caso hay que añadir un cero previo:
2 Establecer variable %segundos a 0%segundos si %segundos < 10
Pues gracias a los dos. Muy buena la aportación si señor. La verdad es que presentar en la app que estoy haciendo un a ristra de números no iba a ser comprensible.
Todavía no lo he probado pq estoy con otra parte pero de seguro que lo utilizaré.
Enviado desde mi GT-N7000 usando Tapatalk 2
Pues ya lo he probado y he de decir que si no hubierais escrito esto los dos me hubiera costado sangre.
Lo he probado porque tengo una escena con seis casillas. En estas se van metiendo los valores de un array, se van metiendo de seis en seis. El problema venia cuando quería saber que casilla ocupa un elemento del array que he creado. Por ejemplo si creo una nueva entrada que se mete como %Var26 que casilla ocuparía de las seis?
Pues con esto consigo que tasker lo sepa:
Accion: (calcular marcado)
Set variable %Ndecasilla a %Wct(#<)-((floor((%Wct(#<)-1)/6))*6)
El - 1 es porque si no los múltiplos de 6, 6,12,18...,me los calcula como 0.
Así que gracias Caravantes y Lukevalci.
Enviado desde mi GT-N7000 usando Tapatalk 2
Caravantes
10/04/13, 22:35:32
...tengo una escena con seis casillas. En estas se van metiendo los valores de un array, se van metiendo de seis en seis. El problema venia cuando quería saber que casilla ocupa un elemento del array que he creado. Por ejemplo si creo una nueva entrada que se mete como %Var26 que casilla ocuparía de las seis?
Vale, creo que el problema está entendido, y la forma de solucionarlo también pero... Porfa, explicanos qué contiene la variable %Wct y concretamente el significado de las partes "(#<)" que incluyes en esa fórmula:
Set variable %Ndecasilla a %Wct(#<)-((floor((%Wct(#<)-1)/6))*6)
Sospecho que estás manejando una tabla pero no entiendo cómo funciona.
Sospechas bien mi querido Caravantes jeje. Efectivamente es para una especie de base de datos. La variable contiene nombres.
Esto: %Var(#<) lo que hace es decirte el valor del ultimo elemento de un array, pero no el contenido. Si %Var26 contiene Carlos no te da Carlos si no 26.
Dejame que haga otro post y te explico como estoy haciendo yo las bases de datos en Tasker.
EDITO: He creado un nuevo post "Como manejar y crear bases de datos en Tasker". Ahí explico cómo lo estoy haciendo yo.
Enviado desde mi GT-N7000 usando Tapatalk 2
Caravantes
13/05/13, 05:45:26
En el siguiente post hay un perfil que también utiliza bastante las matemáticas. Se trata de una tarea que -entre otras cosas- calcula la distancia entre dos ubicaciones GPS: valor absoluto, conversión de grados a metros, redondeos, raiz cuadrada al estilo pitagórico...
http://www.htcmania.com/showthread.php?p=8699477
soymicmic
22/07/13, 12:26:12
Bueno pues una pequeña aportación para variables tipo lógicas
Tenemos un caso como este para darle la "vuelta" a una variable:
A1: Si (if) [ %SEGURO ~ NO ]
A2: Establecer variable [ Nombre:%SEGURO A:SI Calcular:Apagado Añadir:Apagado ]
A3: Else
A4: Establecer variable [ Nombre:%SEGURO A:NO Calcular:Apagado Añadir:Apagado ]
A5: Fin si (End if)
Son 5 acciones para hacer un cambio de variable (que solo puede tomar 2 valores: Si / No)
Podemos optimizarlo a una sola accion si usamos los valores 0 y 1:
A1: Establecer variable %SEGURO a 1 - %SEGURO con Calcular Activado
De esta forma Si Seguro es 1 al pasar por la operacion pasará a ser 0 y viceversa.
Soymicmic... Genial! Elegante y sencillo... Muy buen aporte.
Caravantes
22/07/13, 23:18:06
A1: Establecer variable %SEGURO a 1 - %SEGURO
Creo que si no se activa la opción de CALCULAR, la variable acabará conteniendo lo siguiente: "1 - %SEGURO".
Para que funcione según lo previsto, hay que indicar que se trata de un cálculo matemático, así:
Establecer variable [ Nombre:%SEGURO A:1-%SEGURO Calcular:Encendido Añadir:Apagado ]
Bien observado Caravantes. Efectivamente levas razón hay que marcarlo.
darkopro
21/11/13, 17:48:42
Yo tengo una duda a ver si la podéis solucionar. Quiero que cuando ejecuto una tarea, si lo durante un periodo de tiempo me haga otra cosa. Se que puedo usar perfiles de tiempo que establezcan una variable y en función de esa variable ejecute las tareas de una forma u otra. El problema es que tendría que usar bastantes perfiles de tiempo y no quiero llenar tasker de perfiles de tiempo.
El ejemplo de lo que busco sería:
Si cuando realizo la tarea la variable %TIMES tiene un valor entre 3760 y 4587 (por ejemplo) efectúe una cosa
Caravantes
22/11/13, 00:34:15
Darko, vuelve a leer lo que has escrito ("si lo durante") porque creo que se te ha olvidado incluir alguna palabra y no se entiende bien.
El ejemplo de lo que busco sería: Si cuando realizo la tarea la variable %TIMES tiene un valor entre 3760 y 4587 (por ejemplo) efectúe una cosa
Lo que (parece que) estás preguntando tiene una respuesta sencilla y creo que tú sabes hacerlo de sobra:
- Si(if) %TIMES > 3760
- Si(if) %TIMES < 4587
... acción o acciones a ejecutar cuando se cumplan las dos condiciones
- FinSi(Endif)
- FinSi(Endif)
darkopro
22/11/13, 12:19:49
Darko, vuelve a leer lo que has escrito ("si lo durante") porque creo que se te ha olvidado incluir alguna palabra y no se entiende bien.
Lo que (parece que) estás preguntando tiene una respuesta sencilla y creo que tú sabes hacerlo de sobra:
- Si(if) %TIMES > 3760
- Si(if) %TIMES < 4587
... acción o acciones a ejecutar cuando se cumplan las dos condiciones
- FinSi(Endif)
- FinSi(Endif)
Cierto caravantes, me había calentado la cabeza pensando en hacerlo sólo con un solo comando cuando lo puedo hacer así perfectamente...
Caravantes
19/12/13, 02:21:36
el % ademas de servir como identificador de variables tambien es el mod matematico lo que nos regresa el residuo de una division
Traigo aquí algo que el compañero Kalippo ha aportado en otro hilo (http://www.htcmania.com/showthread.php?t=739807) porque descubre un detalle muy interesante desde el punto de vista matemático. Podemos utilizar el operador MÓDULO que nos devuelve el resto de una división en la que solo se usan números enteros. Por ejemplo, al dividir 100 entre 22 nos da como cociente entero 4 y como resto queda 12. En tasker , para obtener el resto hay que poner un carácter de porcentaje entre dividendo y divisor. así, el resto del ejemplo se puede obtener directamente mediante la operación siguiente:
- Establecer variable %resto a 100%22, calcular encendido.
Este operador MÓDULO está referenciado en el primer post de este hilo, pero no nos habíamos percatado de ello, o no sabíamos usarlo. De hecho, varios mensajes del hilo tratan de buscar un método sencillo para obtener cuántos segundos sueltos (fragmento menor de un minuto) hay en la variable %TIMES. Hasta ahora, la mejor propuesta era la siguiente:
Me he dado cuenta de que, si lo que pretendemos es conocer solo los segundos, hay un procedimiento mucho más sencillo:
1 Establecer variable %segundos a %TIMES - (60*floor(%TIMES/60))
Eso es todo.
Pues ahora Kalippo viene a decirnos que el MÓDULO nos permite una ecuación más simple:
- Establecer variable %segundos a %TIMES%60, calcular encendido.
vBulletin® v3.8.1, Copyright ©2000-2026, Jelsoft Enterprises Ltd.