Jump to content

Luiz_Martins

Pessoal da TecnoSpeed
  • Contagem de Conteúdo

    13
  • Ingressou

  • Última visita

Tudo que foi postado por Luiz_Martins

  1. A pergunta do título pode parecer boba. Como assim somar números? Adicionar números não é algo que fazemos já nos primeiros exercícios de programação? A resposta poderá surpreendê-lo. Quando se trata de somar números inteiros, o resultado é bastante previsível. Vou dar alguns exemplos em Python e Javascript. Em Javascript: const a = 1; const b = 2; const c = a + b; // c = 3 Em Python: a = 1 b = 2 c = a + b # c = 3 Até aí tudo bem. É a resposta que todo mundo conhece! Então onde está o problema? Pois bem. E se o número for racional? No jargão da informática, e se o número for de ponto flutuante? Número com vírgula? Aí as coisas ficam estranhas. Vamos ver um exemplo em Javascript: const a = 0.1; const b = 0.2; const c = a + b; // c = 0.30000000000000004 Mas como assim? Como sabemos, os computadores representam informação - incluindo números - em base 2, ou seja, mesmo números com vírgula são convertidos para números binários ao serem processados. Mas essa conversão é perfeita? Não. Em especial, quando se trata de números de ponto flutuante, essa representação é aproximada. Isso pode levar a erros bastante sutis em nosso código. Tomemos como exemplo a seguinte comparação feita em Javascript: const a = 0.1; const b = 0.2; const c = a + b; if (c == 0.3) { console.log("A soma é igual a 0.3!"); } else { console.log("A soma é diferente de 0.3!"); } O que acontece ao rodarmos o código acima? Pelo que já vimos, a soma é 0.30000000000000004, então cairemos no else, imprimindo "A soma é diferente de 0.3! Isso seria um grande problema se estivéssemos, por exemplo, validando campos de uma nota fiscal. Há campos com tolerância R$ 0,01; outros campos precisam ter valores idênticos (por exemplo, o valor total dos itens tem de bater com o total da nota). Como proceder, então? Há mais de uma maneira de lidar com esse problema. Falarei aqui de duas. A primeira consiste em converter todos os números para inteiros, trabalhar com eles como inteiros e depois covertê-los de volta no final, pois a representação de inteiros não sofre do problema que vimos acima. Essa solução pode ser aplicada em linguagens tipadas que possuam o tipo inteiro (por exemplo, int do C, Integer do Delphi ou u8 do Rust). Para isso, não há segredo. Tomemos como exemplo o seguinte código em Rust: fn main() { let a = 0.1; let b = 0.2; // converti cada número para inteiro após multiplicar por 100 // considerei que as entradas sempre seriam números com duas casas decimais let int_a = (a*100.0) as i64; let int_b = (b*100.0) as i64; // realizei a soma usando inteiros let int_c = int_a + int_b; // converti novamente para float e dividi por 100 para ter o resultado let result = int_c as f64/100.0; // ao realizar comparações, usei o resultado inteiro, não a versão em ponto flutuante! if int_c == 30 { println!("A soma é 0.3! O resultado é {}!", result); } else { println!("A soma não é 0.3! O resultado é {}!", result); } } Outra solução, que funciona para todas as linguagens, é verificar se o valor da diferença entre um número e outro é quase zero: const a = 0.1; const b = 0.2; const c = a + b; const epsilon = 1e-7; if (c - 0.3 < epsilon) { console.log("A soma é igual a 0.3!"); } else { console.log("A soma é diferente de 0.3!"); } A diferença eu chamei de epsilon, inspirando-me na implementação que se recomenda fazer no Rust, mas poderia ter qualquer outro nome que preferir. O importate é que seja um número relativamente pequeno, no caso 0,0000001. O código acima, se rodado, retorna "A soma é igual a 0.3!" como desejado. O mais conveniente é transformar a comparação numa função que retorne verdadeiro ou falso, evitando a duplicação de código e centralizando a lógica para números de ponto flutuante.
  2. Costuma usar sempre a calculadora? Tanto no Linux quanto no Windows, recomendo a calculadora SpeedCrunch. Totalmente livre, ela permite guardar o histórico dos cálculos, é programável e tem um grande números de recursos interessantes, sendo inteiramente personalizável (recomendo revirar os menus!). Uso no meu dia-a-dia, recomendo a amigos e compartilho agora com vocês! https://heldercorreia.bitbucket.io/speedcrunch/
  3. O fato de o chatGPT3 ser capaz de lidar com muitas linguagens de programação torna-o ainda mais interessante para os programadores. Já o adicionei como complemento ao Google no meu fluxo de trabalho e posso dizer que o ganho de performance é real.
  4. Achei essa palestra muito interessante. Explica meios de ser mais efetivo no estudo (e trabalho) e porque muitas vezes falhamos mesmo gastando mais tempo e esforço... youtube.com/watch?v=IlU-zDU6aQ0
  5. Observe as frases abaixo: – O Diretor foi de encontro ao que o funcionário disse – O Diretor foi ao encontro do que o funcionário disse. Ambas expressões estão corretas. No entanto, apresentam significados opostos. Enquanto a primeira expressa oposição entre a atitude do Diretor e a fala do funcionário, a segunda mostra concordância entre elas. Isso ocorre porque a expressão “Ir de encontro a” tem como sentido ir contra alguma coisa ou alguém. Exs: – Enquanto corria, Renato tropeçou e foi de encontro ao chão. (Renato foi contra o chão) – O processo da empresa foi de encontro àquilo que queríamos. (O processo foi contra o que queríamos) Já na segunda frase, a expressão “Ir ao encontro de” significa estar de acordo com, ir em direção a. Exs: – Renato correu ao encontro da namorada. (Renato correu na direção da namorada) – Isso vai ao encontro dos valores da empresa (Isso está de acordo com os valores da empresa) Portanto, se queremos discordar, utilizamos “ir de encontro a” e, se estamos de acordo, usamos “ir ao encontro de”. --- Extraído de http://escreverbem.com.br/ao-encontro-ou-de-encontro/
  6. A maioria desses comandos são comuns em todos os sistemas operacionais Unix ou Unix-like (Linux, BSD, MacOS, etc). Uma grande dica para quem usa Linux/BSD/MacOS é usar o comando man. Esse comando vem de manual e é exatamente isso: é uma explicação detalhada das funções e de como utilizar cada comando. Por exemplo: man ls mostra um manual sobre o comando ls. O retorno (no Linux) é: LS(1) User Commands LS(1) NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DESCRIPTION List information about the FILEs (the current directory by default). Sort entries alphabetically if none of -cftuvSUX nor --sort is speci‐ fied. Mandatory arguments to long options are mandatory for short options too. -a, --all do not ignore entries starting with . -A, --almost-all do not list implied . and .. --author with -l, print the author of each file (...) Não coloquei o manual inteiro, pois é grande! Vale muito a pena ler!
  7. Uma vez instalados, os docsets aparecerão na tela principal: É possível navegar diretamente ou (o que mais uso!) pesquisar: Nesse exemplo, pesquisei pelo termo await e o Zeal me mostrou os resultados em todos os docsets instalados. Na figura, aparece o resultado em Rust.
  8. Para adicionar novas linguagens e frameworks, clique em Tools e depois em Docsets. Na janela Docsets, clique em Available para mostrar as opções disponíveis. Aí é só selecionar a linguagem/framework que desejar e clicar em Download:
  9. Pessoal, Quem aqui não vive sem o Google para programar? Existe uma alternativa bem interessante para a consulta de documentações de linguagens e frameworks totalmente off-line. É o Zeal. São mais de 200 docsets! O programa é livre e pode ser baixado em https://zealdocs.org . Tem versões para Windows, Linux, BSD e MacOS. E para quem usa iOS/iPadOS, existe um app semelhante (e que acessa as mesmas documentações), o Dash. Fica a dica!
×
×
  • Create New...