Números

Teoria Completa

Função type()

Fala aí, cara! Beleza? Você provavelmente já usou vários números em Python pra fazer algumas contas, mas hoje eu vou te contar algumas coisas que acontecem por baixo dos panos quando utilizamos números em Python.

Mas calma, antes de começar nossa jornada pokemón, deixa eu te apresentar um comando que vai ajudar a gente no estudo dos tipos de dados: type().

Esse comando retorna o tipo do dado que você colocar dentro dos parênteses. Olha só um exemplo do funcionamento dele:

Ao executar esse programa, será exibido o tipo da informação que a gente colocou dentro da função type(). A primeira coisa que eu quero te falar sobre esses códigos é sobre a gente ter colocado uma função dentro da outra. Basicamente, a gente tá pegando o resultado de uma e colocando na outra direto, beleza? A primeira ordem ali no, nosso idioma, ficaria assim: “exiba o resultado do tipo do valor 3”.

Depois de executar esse código, o resultado é esse:

O primeiro retorno é int, que é uma abreviação pra integer, ou seja, número inteiro em inglês. Show! Até aqui, tá tudo lindo. Esse valor tem todas as características que a gente conhece sobre números inteiros, lá da matemática.

No entanto, não há nada de muito especial neles, e a gente consegue usar números inteiros sem se preocupar muito. Você só precisa se lembrar que o nome do tipo de dados inteiros é “int”, minúsculo. Mas, e se em vez de inteiros, a gente quiser números reais (com vírgula)?

Vamos ver agora!

Números float em Python

Cara, se você editar um pouquinho o código que a gente escreveu ali em cima e colocar um número com um ponto dentro, tipo assim:

Depois de executar:

O nome é float... Será que o 1.0 voa?! Bom, os números reais são chamados de ponto flutuante em programação, e em inglês é float, okay?! Mas cara, talvez você esteja se perguntando o porquê de 1.0, que é um número inteiro, retornou float. A resposta é que, simplesmente, Python olhou, viu um ponto “.” ali no meio, e chutou que é float, na cara de pau. Então lembre-se, sempre que você tiver um número com “.”, vai ser um float, sempre.

Os números do tipo float são mais abrangentes que os números inteiros. Essas paradas de conjuntos numéricos, reais e inteiros, são matéria antiga. Talvez você não lembre bem do ensino fundamental (muito tempo atrás). Mas eu pesquisei aqui e vou te lembrar. Olha aqui embaixo:

Nessa imagem, os números inteiros (Z) estão dentro dos números reais (R). Ou seja, os números inteiros podem ser representados como reais, mas os reais não podem ser representados como inteiros. Porém, a linguagem Python faz o favor de verificar os tipos pra gente, então a gente não tem que lidar com isso.

Eu só queria enfatizar que, sempre que houver alguma expressão envolvendo números não inteiros, o resultado vai ser um número real. Olha esse código:

A gente sabe que se a gente somar 1.5 com 2.5 na nossa calculadora, o resultado vai ser 4, um número inteiro. Porém, como a gente usou números reais na nossa expressão, tudo vai ser automaticamente convertido pra real. Olha o resultado:

Viu? O resultado da soma é 4, mas foi exibido 4.0 quando a gente mandou imprimir. Além disso, o comando type() aplicado na variável c retornou pra gente o tipo float, o que confirma que o resultado da nossa expressão é considerado um valor real, e não inteiro.

Um caso especial onde a gente tem que ficar ligado é em expressões de divisão. Olha:

Ao executar esse programa, a gente obtém:

Percebe que o resultado é 2.0? Isso é porque a gente usou o operador de divisão real (/). Se a gente tivesse usado o operador de divisão inteira (//), o resultado seria 2, um número inteiro arredondando pra baixo, caso a divisão tenha resto. Ou seja, 5//2 também resulta em 2.

Interpretação de números reais

Agora, pra finalizar, eu queria te falar sobre os problemas dos números reais no computador. Cara, lembra que eu te disse que os computadores só entendem linguagem de máquina, composta por zeros e uns??! Então... Como o computador pode armazenar um número inteiro, como por exemplo o número 25, se ele só entende zeros e uns??

Vou te contar! Todos os números inteiros podem ser representados por combinações entre zeros e uns. Ou seja, números binários. Você não precisa se aprofundar nisso agora, eu só tô citando isso pra você perceber que armazenar números reais com combinações de zeros e uns é algo bastante problemático. Olha, resolve essa conta aqui, de cabeça:

Parece de boas, né? O resultado é 0.6. Agora faz essa:

Bom, o resultado é 0.6 também, né? Independentemente da ordem. Mas cara, se a gente fizer essas duas contas em Python, se liga no que acontece:

Viu? Por algum motivo, os resultados foram diferentes. E esse motivo é bem complicado, mas o que é importante pra você saber por enquanto é que os números float na computação são aproximações muito boas, mas nunca são exatos.

No caso da linguagem Python, que a gente tá usando, a precisão vai ser sempre de aproximadamente 16 casas decimais (também chamado de “precisão dupla”). Isso significa que as 16 primeiras casas decimais de um número real vão estar sempre certas, porém, depois disso o valor é duvidoso. Um exemplo é aquele 1 ali no fim. Repara que ele é exatamente o 16º dígito decimal. A partir desse dígito, incluindo ele, os demais não são confiáveis, beleza?!

Tô te contando isso porque é muito comum a gente ter bugs no nosso programa por conta das imprecisões do tipo float. Então, se algo estiver dando errado na hora que você estiver tentando fazer algum exercício, mantenha a calma e dá uma olhada nos números float.

Ah... O primeiro caso ali, que retornou 0.6, por acaso foi arredondado de forma certeira na hora de exibir. Mas isso não significa que ele é exato. Se a gente fosse olhar os dígitos depois da 16ª casa decimal, com certeza também teria imprecisão, ok?!

Por hoje é isso, galera! Valeu, maninho!

Expandir

Exercício Resolvido #1

Elaboração própria

Escreva um programa que recebe um número inteiro do usuário e exibe o dígito das dezenas. Verifique o funcionamento do seu programa com os seguintes dados:

1935, tem que retornar 3.

3099, tem que retornar 9.

4, tem que retornar 0.

MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Pra resolver esse exercício a gente vai precisar lembrar dos operadores matemáticos em Python. Mas primeiro, vamos escrever o código que recebe o número inteiro.

Pra perguntar algo pro usuário, a gente sempre usa a função input().

Se liga que a gente precisa colocar o comando input() dentro do int() nesse caso. Isso é porque a função input() sempre retorna um valor no formato de texto! Pra gente fazer operações matemáticas, precisamos converter esse valor pra um tipo numérico. Nesse caso, vamos converter pra inteiro, porque tá escrito no enunciado que é pra receber um número inteiro!

Agora a gente precisa pegar o dígito da casa dezenas.

Passo 2

Ok, essa parada de casa das dezenas é matéria lá do ensino fundamental e talvez você não lembre bem, mas calma! Eu te explico. A gente vai usar como exemplo o número 188, que é o número do centro de valorização da vida.

Caso você não conheça, o Centro de Valorização da Vida é um atendimento 24h que realiza apoio emocional e prevenção do suicídio. As ligações são completamente gratuitas e sigilosas. Se você estiver passando por alguma situação difícil, pode ligar pra lá, ok?! Sobre qualquer assunto!

Mas caso você esteja de boas, vamos continuar com a revisão! Olha o número:

Ou seja, o último 8 é uma unidade. O segundo 8, de trás pra frente, tá na casa das dezenas (pois é um 80). O penúltimo número, o 1, tá na casa das centenas (é um 100). Se houvesse um quarto número, de trás pra frente, este estaria na casa das unidades de milhar, etc.

Mas ok, agora que a gente já sabe que a casa das dezenas é sempre o penúltimo dígito do número, como podemos calcular ele de forma matemática? Bom, pra isso a gente vai usar a divisão por dez! Pra esse outro exemplo, pensa no número 1234. Vamos dividir ele por dez:

Repara que o resultado da divisão inteira desse número por 10 é igual ao número sem o último dígito (a gente deletou o último dígito quando fez a divisão inteira por 10!!). E o resto da divisão é justamente o último dígito! Lembra do operador de resto em Python?

Mas acontece que o enunciado não pede o último dígito, mas sim o penúltimo. Mas, cara! Olha de novo ali na divisão por dez. Reparou que o penúltimo dígito de 1234 é justamente o último dígito de 123?! Então vamos juntar as duas operações pra resolver nosso problema!

Passo 3

Sempre é bom a gente fazer alguns testes antes de entregar nosso exercício! Principalmente se o enunciado fornecer dados de teste. Então, vamos testar com os dados fornecidos!

Repara que todas as respostas foram iguais às previstas no enunciado. Com isso, a gente pode considerar que finalizamos o exercício!

Resposta

Exercício Resolvido #2

USP, adaptado.

Dados os números reais a , b e c , calcular as raízes de uma equação do 2º grau na forma a x 2 + b x + c = 0 .

Observações:

  • Caso Δ < 0 , o programa deverá imprimir a seguinte frase: “Não há raízes reais.”.
MOSTRAR SOLUÇÃO COMPLETA

Passo 1

Beleza, para calcularmos as raízes de uma equação do 2º grau, basta nos recordarmos da famosa fórmula de Bhaskara:

Δ = b 2 - 4 a c

x = - b ± Δ 2 a

Passo 2

Agora que já nos familiarizamos com a parte matemática, está na hora de declararmos as variáveis que armazenarão os dados de entrada do nosso programa:

Passo 3

Com essas variáveis declaradas, podemos agora declarar a variável d e l t a e inicializá-la com a expressão b 2 - 4 a c :

E já aproveitando que temo o valor de d e l t a podemos agora mesmo cuidar da observação fornecida pelo enunciado, que é o caso em que Δ < 0 :

Passo 4

Continuando com o código, para evitarmos repetições, podemos declarar uma variável chamada r a i z D e l t a que nos ajudará no cálculo das raízes da função:

Passo 5

Até que enfim, podemos calcular o valor de x ' que no código será representado pela variável x 1 :

Passo 6

Porém, antes de calcularmos x ' ' vamos verificar se Δ > 0 , isso fará com que economizemos computação. Pois, se Δ = 0 , x ' = x ' ' e nós já temos o valor de x ' .

Para isso, basta fazermos o seguinte:

Onde, se Δ > 0 calcularemos x 2 e realizaremos a impressão de x '