<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: feitoza</title>
    <description>The latest articles on DEV Community by feitoza (@feitoza).</description>
    <link>https://dev.to/feitoza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1023327%2F554e20cd-9c0c-4360-801c-1dc2a490ebe9.jpeg</url>
      <title>DEV Community: feitoza</title>
      <link>https://dev.to/feitoza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/feitoza"/>
    <language>en</language>
    <item>
      <title>DESIGN - PADRÃO PROTOTIPO</title>
      <dc:creator>feitoza</dc:creator>
      <pubDate>Fri, 08 Mar 2024 05:05:18 +0000</pubDate>
      <link>https://dev.to/feitoza/design-padrao-prototipo-31di</link>
      <guid>https://dev.to/feitoza/design-padrao-prototipo-31di</guid>
      <description>&lt;h2&gt;
  
  
  Quem é o infeliz?
&lt;/h2&gt;

&lt;p&gt;Basicamente, este padrão proporciona a um objeto a capacidade de ser clonado e faz parte de uma categoria que chamamos de padrões criacionais, pois eles são responsáveis por gerenciar criação de componentes/objetos (alguns exemplos são o Factory, Builder, Singleton e outros).&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual é o B.O.?
&lt;/h2&gt;

&lt;p&gt;Dito isso, você deve estar se perguntando sobre o cenário em que o padrão deve ser aplicado e o motivo, então pensemos na seguinte situação: em uma parte qualquer do nosso código, temos uma função que recebe uma interface de um objeto qualquer, queremos então ter uma cópia dele e apenas fazer algumas alterações em seus atributos. Contudo, não sabemos muito sobre o que queremos clonar e isso nos traz alguns questionamentos. Será que há campos privados? Qual é a complexidade para a construção deste objeto? Isso iria nos deixar presos e dependentes deste objeto? E uma interface (entenda interface como um contrato que diz o que aquele objeto irá me fornecer), infelizmente, não consegue nos fornecer tais informações tão arraigadas ao objeto concreto (entenda concreto como a lógica que o objeto implementa dentro de si).&lt;/p&gt;

&lt;p&gt;Imagine que você quer construir um carro que viu em uma foto, após bastante tempo você tem algo parecido, contudo faltam coisas (componentes internos) que você não consegue visualizar/acessar, devido a ter apenas uma foto para se basear, te impedindo de fazer uma reconstrução autêntica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alguma solução?
&lt;/h2&gt;

&lt;p&gt;A solução para isso seria dar ao objeto que queremos copiar o poder de se clonar, com esta habilidade não precisamos nos preocupar com os problemas citados acima.&lt;/p&gt;

&lt;p&gt;Se a foto que temos do carro pudesse ter um botão de clonagem junto a ela, seria muito mais fácil :P&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementação
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## 1 - interface definindo a capacidade/método de clonagem
interface IPrototipo&amp;lt;ObjetoGenerico&amp;gt;
{
    ObjetoGenerico Clonar();
}
## 2 - interface que define nosso objeto concreto
interface IFulano : IPrototipo&amp;lt;IFulano&amp;gt;
{
    string Beltrano;
    void Imprimir();
}

## 3 - nosso objeto concreto propriamente dito
public class Fulano : IFulano
{
    public string Beltrano;
    ## atributo/campo privado, que restringe o acesso
    ## podendo ser acessado apenas dentro da própria classe Fulano
    private string Siclano;

    public Fulano(string beltrano, string siclano)
    {
        this.Beltrano = beltrano;
        this.Siclano = siclano;
    }
    public void Imprimir()
    {
        Print($"\nBeltrano: {this.Beltrano}");
        Print($"\nSiclano: {this.Siclano}");
    }
    ## 4 - implementação do método de clonagem
    public IFulano Clonar()
    {
        ## observe que há um atributo/campo privado (Siclano) que não
        ## poderíamos acessar para fazer uma cópia do jeito convencional
        ## contudo, como estamos dentro do objeto, é permitido
        ## o acesso a seus atributos/campos privados
        return new Fulano(this.Beltrano, this.Siclano);
    }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Código do cliente definindo o objeto Fulano&lt;br&gt;
e chamando o MétodoExemplo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var objetoOriginal = new Fulano("Jesse", "Feitoza");
MetodoExemplo(objetoOriginal);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Método em algum lugar do nosso código aceitando apenas&lt;br&gt;
a interface do objeto Fulano&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;void MetodoExemplo(IFulano obj)
{
    var objetoClonado = obj.Clonar();
    objetoClonado.Beltrano = "Max";
    objetoClonado.Imprimir();
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>CACHE NO LADO DO CLIENTE</title>
      <dc:creator>feitoza</dc:creator>
      <pubDate>Sat, 11 Nov 2023 10:14:13 +0000</pubDate>
      <link>https://dev.to/feitoza/cache-no-lado-do-cliente-5dj1</link>
      <guid>https://dev.to/feitoza/cache-no-lado-do-cliente-5dj1</guid>
      <description>&lt;p&gt;O armazenamento no lado do cliente é crucial para evitar sobrecarga no servidor e proporcionar maior velocidade na entrega de informações ao usuário. Existem várias formas de realizar isso, considerando o contexto da web.&lt;/p&gt;

&lt;h2&gt;
  
  
  COOKIES
&lt;/h2&gt;

&lt;p&gt;Este é um dos primeiros métodos de armazenamento no lado do cliente, sendo usado, na época, de forma geral para cache. Atualmente, é empregado para armazenar informações relacionadas a sessões de usuários, estados e outros dados menores.&lt;/p&gt;

&lt;h2&gt;
  
  
  WEB STORAGE
&lt;/h2&gt;

&lt;p&gt;Os cookies apresentam um problema de desempenho, enviando dados a cada nova requisição do cliente de volta ao servidor para verificação. Por isso, surgiram novos métodos, como o Web Storage, que armazena dados com a estrutura de chave e valor, permanentemente ou temporariamente (os dados são apagados ao fechar o navegador). É excelente para armazenar dados simples, como nome e foto de perfil de um usuário.&lt;/p&gt;

&lt;h2&gt;
  
  
  INDEXED DB
&lt;/h2&gt;

&lt;p&gt;Esta opção oferece um sistema de banco de dados completo, sendo facilmente utilizado para armazenar estruturas de dados mais complexas, como postagens recorrentes em uma rede social.&lt;/p&gt;

&lt;h2&gt;
  
  
  CACHE API
&lt;/h2&gt;

&lt;p&gt;O funcionamento deste método de armazenamento é um pouco diferente, pois apenas armazena respostas HTTP do servidor. No entanto, há algo especial: os service workers. São processos diretamente relacionados ao seu domínio/site de origem, interceptando as requisições do cliente e respostas do servidor, podendo tratá-las conforme desejado pelo desenvolvedor. Assim, os service workers podem interceptar as respostas do servidor e usar o Cache API para armazenamento, permitindo um site completamente offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  CONCLUSÕES
&lt;/h2&gt;

&lt;p&gt;Claro que poderíamos nos utilizar de outras ferramentas para tal, como o Redis; contudo, temos um grande leque de soluções disponíveis no contexto de sites web, quase que nativamente (pois essas soluções são, em sua grande maioria, APIs escritas em JavaScript) para economia de recursos, melhoria de desempenho e maior satisfação do cliente. That's all, folks!&lt;/p&gt;

&lt;h3&gt;
  
  
  REFERÊNCIAS
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage#offline_asset_storage"&gt;https://developer.mozilla.org/pt-BR/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage#offline_asset_storage&lt;/a&gt;&lt;br&gt;
&lt;a href="https://redis.io/docs/manual/client-side-caching/"&gt;https://redis.io/docs/manual/client-side-caching/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Service_Worker_API"&gt;https://developer.mozilla.org/pt-BR/docs/Web/API/Service_Worker_API&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Cache"&gt;https://developer.mozilla.org/pt-BR/docs/Web/API/Cache&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/IndexedDB_API"&gt;https://developer.mozilla.org/pt-BR/docs/Web/API/IndexedDB_API&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Web_Storage_API"&gt;https://developer.mozilla.org/pt-BR/docs/Web/API/Web_Storage_API&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>FUNDAMENTALS - POINTERS ARE EASY</title>
      <dc:creator>feitoza</dc:creator>
      <pubDate>Thu, 12 Oct 2023 10:58:25 +0000</pubDate>
      <link>https://dev.to/feitoza/pointers-are-easy-h4g</link>
      <guid>https://dev.to/feitoza/pointers-are-easy-h4g</guid>
      <description>&lt;p&gt;You could already have heard about this guy and imagined it as a Hydra from D&amp;amp;D. So today we gonna talk about pointers and show how easy it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Yes, we have to talk about Memory
&lt;/h2&gt;

&lt;p&gt;But before we talk about them, let's see how our programs handle memory. When you create a variable, it is stored in a space in memory and this space has an address to identify the location of it and its value.&lt;/p&gt;

&lt;p&gt;We can imagine memory as a set of lockers, where you store your things (variables) and the address as the number to identify the locker.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finally, pointers!
&lt;/h2&gt;

&lt;p&gt;So wtf are pointers? Pointers are just references to some space in memory that contains a variable a its values.&lt;/p&gt;

&lt;p&gt;Analogy time! Pointers are like your locker key with the locker's number on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  But, when we use pointers?
&lt;/h2&gt;

&lt;p&gt;When you pass a variable to a function as a parameter, and your function receives that value, it doesn't receive the original variable but a copy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Here is a small example in C

// This function gonna receives the copy value
void change_x_value(int x) 
{
    x = 5;
}

int main()
{
    int x = 2;

    printf("Variable before change: %i\n", x);

    change_x_value(&amp;amp;x);

    printf("Variable after change: %i\n", x);
}

// RESULT:
 "Variable before change: 2"
 "Variable after change: 2"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So if you want to change the value of the parameters received directly, you just can't. The solution is to pass a pointer (you are just passing a variable that stores an address/reference) as a parameter to the function that tells exactly where the real value is stored in the memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// This function gonna receives the pointer
// to the variable x and its value 
void change_x_value(int* x)
{
    // * symbol set and get the x variable value 
   // at the specified address
    x* = 5;
}

int main()
{
    int x = 2;

    printf("Variable before change: %i\n", x);

// Now I am passing the pointer (just an address) to the function
    change_x_value(&amp;amp;x); // &amp;amp; symbol just get the address of this variable

    printf("Variable after change: %i\n", x);
}

// RESULT:
 "Variable before change: 2"
 "Variable after change: 5"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  End
&lt;/h2&gt;

&lt;p&gt;Did you see it? It's easy peasy lemon squeezy, don't need to be afraid of pointers anymore.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>computerscience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>FUNDAMENTALS - CONCEITO DE INTERPRETAÇÃO</title>
      <dc:creator>feitoza</dc:creator>
      <pubDate>Fri, 12 May 2023 22:58:18 +0000</pubDate>
      <link>https://dev.to/feitoza/json-parser-conceitos-basicos-de-interpretacao-8e0</link>
      <guid>https://dev.to/feitoza/json-parser-conceitos-basicos-de-interpretacao-8e0</guid>
      <description>&lt;p&gt;Eu tive a grata e, ao mesmo tempo, a infelicidade de tentar escrever meu próprio JSON Parser(converte dados de tipo JSON em estruturas equivalentes para sua linguagem de programação e vice-versa) utilizando Elixir. Então, isso despertou a vontade de entender mais sobre o assunto e discorrer de forma simples o conceito de interpretação.&lt;/p&gt;

&lt;p&gt;Muitas linguagens de programação são interpretadas (php, python) ou compiladas (C/C++, Erlang), ou uma mistura dos dois (Java, Kotlin, C#), mas isso não é uma lei já que dá pra compilar código fonte python, então já dá para notar que o buraco é mais embaixo. Mas no geral esses processos de interpretação/compilação passam por etapas essenciais muito parecidas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Analise de Léxico
&lt;/h2&gt;

&lt;p&gt;Levando em consideração o JSON Parser, primeiro teremos a etapa de análise de léxico ou tokenização, basicamente consiste em receber um código fonte, como um JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;“I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;choose&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;love”&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“s&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;percorrer o código e dividi-lo em pequenas partes chamadas de tokens, fazendo uma lista, tal qual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“I”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;”choose”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“love”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“:”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“s&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesta fase não há nenhum tipo de validação se esses tokens são realmente válidos, ou seja, eles não têm valor algum. &lt;/p&gt;

&lt;p&gt;Fazendo um paralelo, poderíamos pegar uma sentença, como “Eu escolho o amor” e dividi-la por palavras &lt;code&gt;[“Eu”, “escolho”, “o”, “amor”]&lt;/code&gt;, essas palavras não tem uma função ou valor; claro, algumas são pronomes, verbos e substantivos, mas qual a função/valor delas em uma sentença/oração ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Analise Sintática
&lt;/h2&gt;

&lt;p&gt;Pensando em valor/função é que passamos para nossa segunda etapa, análise sintática ou parsing (analisar), onde basicamente irá, de acordo com um conjunto de regras preestabelecidas, dar valor/função a cada um desses tokens e validá-los. Exemplo, todo texto JSON começa com chaves &lt;code&gt;{&lt;/code&gt; e termina com &lt;code&gt;}&lt;/code&gt; e deve haver no mínimo uma key, com aspas duplas envolvendo-as, dois pontos &lt;code&gt;:&lt;/code&gt; para identificar a atribuição de valor e um valor qualquer. Então nossos tokens são validos.&lt;/p&gt;

&lt;p&gt;Voltando ao exemplo da nossa sentença “Eu escolho o amor”, também podemos realizar a análise sintática dessas palavras, ou seja, descobrir a função que cada uma dessas partes desempenha em nossa sentença, como: &lt;code&gt;“Eu” = Sujeito [“escolho”, “o”, “amor”] = Predicado&lt;/code&gt;. Claro, estamos fazendo essa análise devido a regras pré-definidas. &lt;/p&gt;

&lt;p&gt;Mas e se eu tiver um JSON com mais camadas ? Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"MyLoves"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"programming"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"I hate u I luv u"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"Diana"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my unique luv"&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso você terá que realizar as verificações que já são feitas so que de forma recursiva, levando em conta o ponto de partida (camada mais alta) do JSON &lt;code&gt;{&lt;/code&gt; e o ponto de termino (camada mais baixa) &lt;code&gt;}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este artigo foi so a pontinha do iceberg, contudo há muito conteúdo se aprofundando nessas aguas misteriosas e estarei deixando alguns aqui embaixo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://craftinginterpreters.com/" rel="noopener noreferrer"&gt;Crafting Interpreters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.com.br/Compiladores-princ%C3%ADpios-ferramentas-Alfred-Aho/dp/8588639246/ref=asc_df_8588639246/?tag=googleshopp00-20&amp;amp;linkCode=df0&amp;amp;hvadid=379792581512&amp;amp;hvpos=&amp;amp;hvnetw=g&amp;amp;hvrand=13539101328651479700&amp;amp;hvpone=&amp;amp;hvptwo=&amp;amp;hvqmt=&amp;amp;hvdev=c&amp;amp;hvdvcmdl=&amp;amp;hvlocint=&amp;amp;hvlocphy=1031632&amp;amp;hvtargid=pla-810094896642&amp;amp;psc=1" rel="noopener noreferrer"&gt;Compiladores: Princípios, Técnicas e Ferramentas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.toWriting%20a%20C%20Compiler,%20Part%201"&gt;Writing a C Compiler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>programming</category>
      <category>cli</category>
      <category>modular</category>
    </item>
    <item>
      <title>ALGORITHMS - BUSCA BINÁRIA</title>
      <dc:creator>feitoza</dc:creator>
      <pubDate>Thu, 16 Mar 2023 23:52:28 +0000</pubDate>
      <link>https://dev.to/feitoza/algoritmos-binary-search-4jlb</link>
      <guid>https://dev.to/feitoza/algoritmos-binary-search-4jlb</guid>
      <description>&lt;p&gt;Algoritmos são sequências de instruções para se resolver um determinado problema, contudo eles podem variar em efiência e perfomance para resolução do mesmo. Dito isto, seu estudo é importante para qualquer programador, pois muitas vezes ja pegamos "coisas prontas" e usamos indiscriminadamente sem entender os &lt;strong&gt;&lt;em&gt;trade-offs&lt;/em&gt;&lt;/strong&gt; das mesmas. Isso limita o programador e sua visão criativa/resolutiva, ou seja, ele é dominado pelas ferramentas que usa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceitos Básicos
&lt;/h2&gt;

&lt;p&gt;O algoritmo que iremos ver é o de busca binária (binary search), sendo o nome bem sugestivo podemos ter uma ideia do problema que ele resolve. &lt;/p&gt;

&lt;p&gt;Imaginemos que você tenha que achar a pagina 567, porque por algum motivo você perdeu o marcador de novo, em um livro de 1000 paginas. Como você faria essa busca ? O mais comum a se fazer seria começar a busca pelo meio, certo ? Pois, a pagina 567 fica mais próxima do meio do livro. Com certeza, essa uma maneira bem mais rápida de buscar, do que olhar pagina por pagina.&lt;/p&gt;

&lt;p&gt;O conceito de busca binária não é muito diferente do exemplo do livro, mas irei ilustrar com um exemplo um pouco melhor, menos livroso. Você está tentando adivinhar número de meias listradas (que é 57) que uma pessoa tem, ela irá te dizer se você disse um número muito acima ou baixo da atual quantidade, entre 1 a 100.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozsqxsu4ffev7muwg1zh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozsqxsu4ffev7muwg1zh.png" alt="acho que é.." width="610" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Há duas maneiras de resolver este problema:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Busca simples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Podemos começar pelo número 1, 2, 3, 4, 5... e assim por diante, estando essas tentativas muito abaixo do número atual de meias listradas e continuaremos a verificar item por item até o número desejado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyeizjkfokelbihfsi8n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkyeizjkfokelbihfsi8n.png" alt="busca simples é bem demorada em alguns casos" width="593" height="327"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Busca binária&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Outra opção seria começar pelo meio, no caso, o número 50 que ainda está abaixo da quantidade atual. Sabendo disso podemos eliminar a metade (1 a 50, nos restando de 51 a 100) e tentar novamente, por exemplo 58, mas ainda é um valor acima do número que procuramos, mais uma vez eliminamos a metade (de 58 a 100, nos restando de 52 a 57) e tentamos novamente. Podemos tentar agora 57 e acertamos a quantidade das benditas meias listradas. Veja o exemplo escrito em C logo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Bem, aqui estamos passando uma lista de inteiros e o seu tamanho (uma cortesia do C)
int binary_search(int itens[], int length)
{
    int abaixo = 0;
    int acima = length - 1;

    // O nosso intuito é iniciar nossa busca pelo meio da lista
    int meio = length - 1 / 2;

    // Item que desejamos achar
    int item_desejado = 5;

    while (abaixo &amp;lt;= acima)
    {
        // Atualizando o nosso "novo meio"
        meio = abaixo + acima;

        // Nosso palpite sempre será o meio da nossa lista
        int palpite = itens[meio];

        // Se nosso palpite estiver certo, retornamos o lugar onde o item está
        if (palpite == item_desejado)
            return meio;

        // Caso esteja errado, iremos verificar se o palpite está muito acima ou abaixo do esperado
        if (palpite &amp;gt; item_desejado)
        {
            // Estando acima do esperado, cortamos metade das possibilidades acima
            acima = meio - 1;
        }
        else
        {
            // Estando abaixo do esperado, cortamos metade das possibilidades abaixo
            abaixo = meio + 1;
        }
    }


}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contudo o algoritmo irá funcionar apenas com lista de dados ordenados, como [1,2,3] ou ["Ana", "Bob", "Carla"].&lt;/p&gt;

&lt;p&gt;Mas você já deve estar conseguindo sentir o cheirinho das aplicações desse algoritmo no mundo real, como consultas em banco de dados ou pesquisa de uma música na sua playlist (se ordenada).&lt;/p&gt;

</description>
      <category>linux</category>
      <category>debian</category>
      <category>productivity</category>
    </item>
    <item>
      <title>FUNDAMENTALS - CONCEITO DE FLOATING POINT NUMBER</title>
      <dc:creator>feitoza</dc:creator>
      <pubDate>Sat, 25 Feb 2023 09:09:30 +0000</pubDate>
      <link>https://dev.to/feitoza/entendendo-o-conceito-de-floating-point-numbers-24hf</link>
      <guid>https://dev.to/feitoza/entendendo-o-conceito-de-floating-point-numbers-24hf</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Pode parecer algo simples e cotidiano, mas os números fracionados/racionais, como &lt;code&gt;1.5&lt;/code&gt;, &lt;code&gt;0.25&lt;/code&gt;, &lt;code&gt;0.000005&lt;/code&gt; eram um desafio para os computadores operarem e representarem. Então irei apresentar os conceitos básicos de como chegamos ao que conhecemos hoje como float number e as vantagens e desvantagens (ou quase).&lt;/p&gt;

&lt;h2&gt;
  
  
  Como computadores representam números
&lt;/h2&gt;

&lt;p&gt;Quando pensamos na representação de números para computadores o sistema binário é essencial, pois 1s e 0s podem ser interpretados como "on" e "off", sendo cada um desses estados um bit de informação, perfeito para máquinas. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fXOeGHtN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/br1tzyap4t51wwxn15fv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fXOeGHtN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/br1tzyap4t51wwxn15fv.png" alt="máquinas entendem 0s e 1s" width="523" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então poderíamos representar os números 8 e 4 desta maneira, respectivamente, em binário &lt;code&gt;1000&lt;/code&gt;, &lt;code&gt;100&lt;/code&gt;. Agora que conseguimos representa-los para o computador, ele pode começar a realizar operações, tais como uma adição 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;1000+100=11001000 + 100 = 1100&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1000&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;100&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1100&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 ou 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;8+4=128 + 4 = 12&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;8&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;+&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;4&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;12&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
. &lt;/p&gt;

&lt;p&gt;De fato, as máquinas não tem dificuldades na representação de números inteiros ou mesmo em realizar operações matemáticas, contudo como poderíamos fazer o mesmo com números fracionados ?&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixed point number
&lt;/h2&gt;

&lt;p&gt;Podemos representar números fracionados em binário da mesma maneira que números decimais &lt;code&gt;10.2 -&amp;gt; 1010.10&lt;/code&gt;. O principal para a representação desses números é o ponto decimal, separando a parte inteira da fracionada. Contudo, este ponto é algo "imaginário", conseguimos representar sem problemas no papel, mas com máquinas é diferente, pois há apenas 0s e 1s para se trabalhar. &lt;/p&gt;

&lt;p&gt;Mas gigantes descobriram que os computadores poderiam representar números fracionados da seguinte maneira:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// vamos imaginar que temos 12 bits de informação
 000000000000

// separamos 8 bits para a parte inteira do número
 [00000000]0000

// e 4 bits para representar a parte fracionada
 [00000000][0000]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Logo, poderíamos representar o número 10.125, assim: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// convertemos para binário
 10.125 -&amp;gt; 1010.001

// adicionamos zeros até dá os 8 bits da parte inteira
 00001010

// e os 4 bits representando a parte fracionada
 00001010 0010
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;OBS:&lt;/em&gt;&lt;/strong&gt; cada coluna dos 4 bits da parte fracionada representam os seguintes valores 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;12\frac{1}{2}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
,  
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;14\frac{1}{4}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;18\frac{1}{8}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;116\frac{1}{16}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;16&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8k5zVYJv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9icd8l11f14fmm648hoa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8k5zVYJv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9icd8l11f14fmm648hoa.png" alt="isso nos limita muito na representação dos números" width="449" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Entretanto, se você necessitar de um número muito preciso, o método fixed point não será o melhor, pois a quantidade de bits limita o quão pequeno ou grande o número pode ser, logo perdendo precisão, contudo ele é ótimo para sistemas em tempo real que necessitam de velocidade e não precisão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Floating point number
&lt;/h2&gt;

&lt;p&gt;Lembram-se do conceito de &lt;strong&gt;notação científica&lt;/strong&gt; ? ...não se preocupe, vou te refrescar a memória. &lt;/p&gt;

&lt;p&gt;Temos um número real &lt;strong&gt;N&lt;/strong&gt; que deve ser 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;1&amp;gt;=N&amp;lt;101 &amp;gt;= N &amp;lt; 10&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;N&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, podemos chamar essa parte de &lt;strong&gt;mantissa&lt;/strong&gt;, também temos um inteiro &lt;strong&gt;n&lt;/strong&gt;, o &lt;strong&gt;expoente&lt;/strong&gt;, nos informando quantas colunas/casas o ponto deve andar para representar o número de fato. &lt;/p&gt;

&lt;p&gt;Então ficaria assim: 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;6.25∗109=62500000006.25 * 10^{9} = 6250000000&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6.25&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mrel"&gt;=&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;6250000000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
, desta maneira conseguimos representar números colossais, como a velocidade da luz no vácuo 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;3,0∗10⁸ms3,0 * 10⁸ \frac{m}{s}&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;3&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;10⁸&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mopen nulldelimiter"&gt;&lt;/span&gt;&lt;span class="mfrac"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;s&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="frac-line"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mathnormal mtight"&gt;m&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mclose nulldelimiter"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 ou mesmo a massa de um elétron 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;9,11∗10−31kg9,11 * 10^{-31} kg&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;9&lt;/span&gt;&lt;span class="mpunct"&gt;,&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mord"&gt;11&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;span class="mbin"&gt;∗&lt;/span&gt;&lt;span class="mspace"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;1&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;0&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;&lt;span class="mord mtight"&gt;−&lt;/span&gt;&lt;span class="mord mtight"&gt;31&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;k&lt;/span&gt;&lt;span class="mord mathnormal"&gt;g&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
.&lt;br&gt;&lt;br&gt;
Flexível, né ? E é com essa mesma premissa que os floating point numbers se utilizam para representar números fracionados. &lt;/p&gt;

&lt;p&gt;Vamos entender isso de forma simplificada, pensando em um sistema de 32 bits podemos utilizar 1 bit como sinal, positivo ou negativo, 8 bits para o expoente, que definirá onde nosso ponto irá estar, separando a parte inteira da fracionada, e 23 bits para a mantissa, o número de dígitos em si. &lt;/p&gt;

&lt;p&gt;Com isso podemos representar o número 10.5 da seguinte maneira &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// convertemos para binário 
    10.5 -&amp;gt; 1010.1

// passamos para notação científica 
    1010.1 -&amp;gt; 1.0101 e3     // colocamos o ponto após o primeiro digito e contamos
                            // quantas casas há depois do ponto até a parte fracionada
                            // onde *e* é o expoente, nos dizendo a quantidade de casas
                            // que o ponto tem que pular.


// agora vamos somar o expoente 3 com 127
// que nos permite representar números de -127 até 127
    3 + 127 = 130 -&amp;gt; 10000010  // agora temos o expoente

// acrescente zeros até dá os 24 bits da mantissa
    1.0101 -&amp;gt; 1.0101000000000000000000

// remova o digito antes do ponto, ficando 23 bits para a mantissa
    1.0101000000000000000000 -&amp;gt; 0101000000000000000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Resultado&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sinal&lt;/th&gt;
&lt;th&gt;Expoente&lt;/th&gt;
&lt;th&gt;Mantissa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10000010&lt;/td&gt;
&lt;td&gt;0101000000000000000000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Agora podemos pegar a mantissa e pular a quantidade de colunas/casas a partir do primeiro digito que o expoente nos informa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lwA6Y8bw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2o4is16exzjdmjlc7n1o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lwA6Y8bw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2o4is16exzjdmjlc7n1o.png" alt="o ponto parece está flutuando de uma coluna para outra" width="557" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desta maneira, computadores conseguem representar números fracionados com maior precisão e realizar operações, como adição, subtração e entre outras.&lt;/p&gt;

&lt;p&gt;O fato de este padrão (estabelecido pelo IEEE) se chamar numero de ponto flutuante se dá pelo fato das casas/colunas que pulamos para estabelecer o ponto imaginário que divide a parte inteira da fracionada.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>computerscience</category>
      <category>math</category>
    </item>
  </channel>
</rss>
