jueves, 26 de noviembre de 2015

T2. LAS FUNCIONES INT() Y FLOAT(). CUANDO LA PRECISIÓN ES UN GRADO.

LÍQUENES SOBRE LA ROCA. MONTE DEL AGUA. NORTE DE TENERIFE
     La función int() convierte, cuando sea posible, cualquier argumento que le pasemos en un número entero. Para ello es necesario introducir dígitos y no letras. Puede ser un mismo número entero o un número cualquiera siempre que esté en base 10. No ofrece redondeo por sí mismo devolviendo, cuando pasamos un float(), tan sólo el entero (a la izquierda del punto) y eliminando los decimales (a la derecha del punto). La función int() sólo admite un argumento.   



La función float() desarrolla un trabajo similar al de la función int() y con similares limitaciones, en este caso, para los decimales.




Normalmente, no necesitamos, valga la expresión, "rizar el rizo" cuando escribimos un decimal o esperamos recibirlo como resultado de la ejecución de un código. Pero cuando necesitamos escribir o recibir resultados más exactos para efectuar cálculos que requieran de una elevada precisión (pongamos por caso, la trayectoria milimétrica de un microsatélite entre órbitas, la cantidad exacta de radioterapia para eliminar un melanoma antes de que crezca demasiado con el mínimo perjuicio para el paciente, o las dimensiones en armstrongs de una arqueobacteria o un retrovirus, cálculos científicos, vamos), podemos apoyarnos en el módulo 'decimal' que nos ofrece números decimales que se mostrarán con la exactitud que especifiquemos.
Veamos un ejemplo de su funcionamiento:



Los números decimales se crean utilizando la función decimal.Decimal(). Es importante tener en cuenta que esta función puede tomar como argumento un número INT, como en el argumentado de la función asignado a la variable x, o una cadena literal o string, STR, como en el argumentado de la función asignado a la variable y, pero no un valor de tipo FLOAT.

EL PEÑÓN DE GARACHICO Y LA VILLA HOMÓNIMA

      Todas las operaciones aritméticas simples (sumas, restas, multiplicaciones, divisiones, etc.), las funciones aritméticas así como la asignación aumentada, son susceptibles de ser utilizadas con la función decimal.Decimal() con las siguientes restricciones:
A) Si el operador aritmético ** tiene un operando en el lado izquierdo (a**b, sería a) decimal.Decimal(), su operando del lado derecho (b, en nuestro caso) tendrá que ser un entero. Por concomitancia, si el primer argumento de la función pow() es decimal.Decimal(), entonces su segundo y el tercero (recordemos que éste último es opcional) tendrán que ser también enteros.
Veamos un pequeño ejemplo a continuación:




B) Los módulos 'math' y 'cmath' de la librería estándar de Python no resultan apropiados para utilizarlos con la función decimal.Decimal().
El tipo de datos decimal.Decimal funciona en el ámbito que impone la precisión numérica que queramos conseguir, y cuyo valor por defecto es de nada menos que 28 posiciones decimales. Podemos emplear técnicas de redondeo si lo consideramos oportuno mediante la función integrada round().
Pongamos un ejemplo de uso:


   
COSTA NORTE DE ANAGA, CON LA PUNTA DEL HIDALGO AL FONDO.

Respuesta a la pregunta de jhonato:

SCRIPT:


RESULTADO:


Para que quede más correcto, aquí te muestro el mismo script optimizado para incluir los años bisiestos. Fíjate como el resultado final cambia habiendo introducido la misma fecha de nacimiento en ambos casos, con la inclusión de los bisiestos:

SCRIPT:



* Resultado con la aplicación de una fecha nueva:



8 comentarios:

  1. Hola como estas?
    tengo esta duda me podrías ayudar para poder realizarlo esto necesito sacar me he estado cabeceando muchos días y como tu eres experto, sin tanto rodeo esto es lo que necesito realizar.

    Calcular los minutos de vida de una persona, ingresando la fecha actual y la fecha de nacimiento, formato DDMMAAAA. No contemplar los años bisiestos.
    Se tiene que retornar, los minutos de vida, horas de vida y días de vida en una tupla.return (min_dias, horas_dias, total_días)

    De antemano muchas gracias.

    ResponderEliminar
    Respuestas
    1. Hola, jhonato. Lo primero de todo es agradecer tu interés por consultar este sitio web y mi deseo de que te sirva de ayuda para progresar en tus conocimientos sobre Python. No soy un experto, jhonato, pero comparto mis conocimientos con personas como tú que muestran interés por aprender.
      Por norma general, y como ya aclaré en la introducción, no es mi intención responder a cuestiones de programación, básicamente, por falta de tiempo.
      De todas formas, voy a intentar resolver tus dudas. He creado un script para obtener lo que pides (y espero haberlo hecho bien) y muestro el resultado de la ejecución del mismo.
      Ten en cuenta que es necesario importar, al menos, una librería de la biblioteca estándar de Python, con sus clases y sus métodos.
      El script y el resultado lo publico justo por encima de la zona de comentarios de esta entrada porque el contenido es demasiado grande para los requisitos del blog.
      Espero que te sirva.
      Saludos.

      Eliminar
    2. Hola Gauber trate de ejecutarlo y me dio un error :( , espero tu respuesta.

      Saludos¡¡

      Eliminar
    3. Hola, jhnato. Como puedes ver, las devoluciones son las esperadas tras la ejecución de los dos scripts, el primero sin tener en cuenta los años bisiestos y el segundo, teniéndolos. La versión de Python que utilizo es la 3.6, con lo que sería conveniente comprobar que tu versión de Python fuera similar o superior.
      No sé qué error te puede dar porque no me lo dices (esta información debe proporcionártela el propio Python a través de sus excepciones en el tiempo de ejecución). Personalmente, me inclino a pensar que si copiaste el código "a mano" se te puede haber quedado algún detalle por escribir o que te falte algún carácter aquí o allá.
      Mi consejo es que reescribas el código y lo vayas ejecutando paso a paso, por ejemplo, antes de cada función print() para que vayas controlando posibles errores ortográficos.
      Saludos.

      Eliminar
  2. hola una consulta tengo problemas con el codigo solo puedo ingresar la fecha que tu muestras 02/11/2000 al ingresar otra me dice error fecha no valida

    ResponderEliminar
  3. Hola, Esteban. Como puedes comprobar, he añadido una nueva captura con una fecha nueva para comprobar si el código funciona, y así es. Quizás el error se debe a que no introduces la fecha en el formato dd/mm/yyyy, que es la estructura que lee y evalúa la expresión regular que tenemos almacenada en reg, y que se encarga de verificar, a través del parámetro que pasamos al método compile(), si el dato introducido por el usuario es válido o no, o que algún dato de la fecha está mal escrito, por ejemplo, que hayas pasado como dd 43, ya que la expresión regular no te la admitiría (el número máximo debe ser 31). Saludos.

    ResponderEliminar
  4. Hola buenas, consultando el código creo que el regex tiene un fallo para ingresar fechas; concretamente la del mes de octubre. Creo que bastaría con cambiar la fecha mes del regex 1[1-2] por 1[0-2]. Saludos.

    ResponderEliminar
    Respuestas
    1. Hola, Rolandoors. Muchísimas gracias por tu excelente aportación. Una enorme satisfacción comprobar como usuarios como Ud. estudian y revisan los códigos. Así nos beneficiamos todos y todos aprendemos. Saludos.

      Eliminar