|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Matemáticas en Tasker
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
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?
Operadores
Constantes
Funciones Las funciones toman su argumento entre paréntesis, por ejemplo sin(90)
----------------------------------------- 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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Los siguientes 3 usuarios han agradecido a Caravantes su comentario: | ||
|
|
|
#2
|
||||
|
||||
|
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
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Los siguientes 3 usuarios han agradecido a Caravantes su comentario: | ||
|
#3
|
||||
|
||||
|
Re: Matemáticas en Tasker
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
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#4
|
||||
|
||||
|
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, Última edición por Lukevalci Día 20/03/13 a las 23:46:37. |
|
#5
|
||||
|
||||
|
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.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Última edición por Caravantes Día 21/03/13 a las 01:59:45. |
|
#6
|
||||
|
||||
|
1) Establecer variable %segundos a %TIMES - (100*floor(%TIMES/100)) 2) Si %segundos = 60 2.1) Establecer variable %segundos a 003) Else Si %segundos > 60 3.1) Establecer variable %segundos a %segundos - 604) Else Si %segundos < 60 4.1) Detener5) Fin si Si ahora hacemos un Pop Up de %segundos nos mostrará el valor aproximado de los segundos en formato '' Última edición por Lukevalci Día 21/03/13 a las 18:06:21. |
| Gracias de parte de: | ||
|
#7
|
||||
|
||||
|
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
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Última edición por Caravantes Día 06/01/14 a las 00:49:08. |
| Gracias de parte de: | ||
|
#8
|
||||
|
||||
|
Re: Matemáticas en Tasker
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
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#9
|
||||
|
||||
|
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
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#10
|
||||
|
||||
|
...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?
![]() Set variable %Ndecasilla a %Wct(#<)-((floor((%Wct(#<)-1)/6))*6) Sospecho que estás manejando una tabla pero no entiendo cómo funciona.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#11
|
||||
|
||||
|
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
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
Última edición por mlesir Día 12/04/13 a las 17:14:45. |
|
#12
|
||||
|
||||
|
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
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Última edición por Caravantes Día 28/06/13 a las 00:09:40. |
|
#13
|
||||
|
||||
|
Variables logicas y flip-flop
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. Última edición por soymicmic Día 23/07/13 a las 08:06:19. Razón: Edito: añadir la opción Calcular a la hora de establecer la variable |
| Los siguientes 5 usuarios han agradecido a soymicmic su comentario: | ||
|
#14
|
||||
|
||||
|
Soymicmic... Genial! Elegante y sencillo... Muy buen aporte.
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
| Gracias de parte de: | ||
|
#15
|
||||
|
||||
|
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 ]
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Gracias de parte de: | ||
|
#16
|
||||
|
||||
|
Bien observado Caravantes. Efectivamente levas razón hay que marcarlo.
__________________
Fdo: Mlesir. Miembro del equipo que promueve el foro y el recopilatorio de Tasker http://www.htcmania.com/forumdisplay.php?f=969
|
|
#17
|
||||
|
||||
|
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 |
|
#18
|
||||
|
||||
|
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.
- Si(if) %TIMES > 3760 - Si(if) %TIMES < 4587 ... acción o acciones a ejecutar cuando se cumplan las dos condiciones - FinSi(Endif) - FinSi(Endif)
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
|
#19
|
||||
|
||||
|
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) ![]() |
|
|
|
#20
|
||||
|
||||
|
- 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: - Establecer variable %segundos a %TIMES%60, calcular encendido.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
|
| Gracias de parte de: | ||
![]() |
Estás aquí
|
||||||
|
||||||