Sobre o site

Bit is myth … demystify it!

É um blog sobre programação, C principalmente, e cultura Unix.

Pretende ser um guia de referência para programadores e estudantes desta linguagem.

O material aqui está sobre o Creative Commons… Blá Blá….

Happy coding, folks!

11 comentários sobre “Sobre o site

  1. Amigão! você parece ter bastante experiência. estou começando a aprender C usando o livro dos irmãos Deitel, C como programar 6ªEd, gostaria de saber se você teria alguma dica, qualquer que seja, que me possa ser útil nesse início como nomes de livros, sites, experiência..

    Obs: também não gosto de java rsrsr, não conheço a linguaguem mas não sei o porque nunca gostei. Parece que são necessárias muitas “gambiarras”, me sinto sujo só de ver uma linha de código em java kkkk.

    Agradeço! :)

    1. Experiência nunca se tem bastante (talvez o Fred seja a única exceção que eu conheço à esta regra;-).
      Se posso recomendar alguma coisa:

      Nunca comece a aprender C, ou qualquer coisa, sem antes ler o livro do criador da “coisa”.

      Leia em inglês se quiser achar algo realmente bom. Raríssimas exceções são escritas em pt-BR. Não que não tenhamos bons programadores e escritores, mas os bons, normalmente não sobrevivem ou tem que traduzir para sobreviver – pule a etapa e traduza vc mesmo, vai ficar mais atualizado.

      Volte sempre à base: sempre gosto de escrever o “hello world”, de qualquer linguagem.

  2. Olá,

    Li seus artigos no site BIT IS MYTH, se puder me tirar algumas dúvidas.

    Estou trabalhando em um processo que necessita arrendondar uma representação em ponto flutuante no Arduino, no caso modificar o método de arredondamento padrão do “para mais próximo”, intercalando os outro s modos como: “para o mais baixo” e “para cima”, obtendo assim um intervalo.

    É possível modificar o modo de arredondamento no Arduino, utilizando bibliotecas em C++, na própria IDE do arduino ou utilizando Assembly?

    Ou pelo menos obter a ULP de um valor especifico que é representado em ponto flutuante?

    Desculpe se a resposta já estiver em algum artigo, pois não encontrei com certeza, obrigado.

    Desde já gradeço.

    1. Pedro, não faço idéia se o Arduino segue, à risca, a especificação IEEE 754. Acredito que não (pois não há espaço ou poder de processamento para isso). Mas, confesso que não compreendi sua intenção… Note que a inexatidão é um fator intrínseco em ponto-flutuante, especialmente quando falamos da conversão de valores decimais (citados no código fonte) para binários (contidos no código compilado). Se a ideia usar uma precisão “mínima” aceitável, deve-se ater às recomendações da IEEE (7 algarismos para floats, 16 para double). O resíduo, tanto na conversão decimal->binário, e vice-versa, deve ser considerado cuidadosamente no algoritmo em uso, mas ele é inevitável.

      Se a ideia é garantir uma precisão em base 10, a alternativa é usar uma biblioteca de “precisão múltipla” (libgmp, por exemplo), mas elas apresentam dois problemas: Os valores são representados como strings, ocupando muito espaço, e são lentas! Acho que isso pode ser impraticável em usar com os recursos limitados que o Arduino oferece.

      Mesmo assim, verifique se o compilador que você está usando pro Arduino suporta o header e funções como fegetround() e fesetround() (acredito que não)… Essas funções usam as constantes FE_TONEAREST, FE_UPWARD, FE_DOWNWARD e FE_TOWARDZERO.

      []s

      1. Frederico, muito obrigado pelo esclarecimento.

        Pelo o que verifiquei o compilador não suporta, mesmo utilizando bibliotecas como a Boost: https://github.com/vancegroup/arduino-boost
        e a biblioteca padrão de C++:
        https://github.com/rpavlik/StandardCplusplus
        que contêm essas funções.

        A minha intenção é aplicar análise intervalar em processos que utilizam microcontroladores, já havia usado no software Matlab, em que o mesmo disponibiliza “setar” o modo de arredondamento

        “x+ = System_dependent(‘setround’,Inf)”
        “x- = System_dependent(‘setround’,-Inf)”
        “D = ULP(x) % função que retorna a distância do ponto flutuante “x” e o próximo ponto flutuante.

        Desta maneira possibilitando criar um intervalo [ x-, x+ ], ao representar um número em ponto flutuante, como as operações utilizando os mesmos. Assim trabalhando sempre com intervalos, a ideia é como o computador não consegue representar todos os números em ponto flutuante, pelo menos posso garantir que o número está dentro do intervalo, obtendo mais confiabilidade em simulações mais extensas.

        Desculpe meu desconhecimento, mas estou aprofundando agora sobre o funcionamento do microcontrolador. Como seu conhecimento em Arduino e outros plataformas.

        É possível utilizando outro compilador usar as funções de C++ para arredondamento ou obtenção da ULP do número ou alguma função que obtenho a distância do ponto flutuante e o próximo ponto flutuante ?

        Ou é possível utilizando o Atmega ou outra plataforma embarcada?

        Desde já agradeço pela atenção.

      2. Com relação à obtenção do ULP, você sempre pode fazer algo assim, se tiver a biblioteca padrão:
        float getULP(float v)
        {
        int *e;

        frexpf(v, &e);
        return fabsf(FLT_EPSILON * powf(2.0f,e));
        }

        É claro, se os tipos estiverem codificados de forma padrão (IEEE 754) você pode também fazer assim:
        float getULP(float v)
        {
        uint32_t *p = (uint32_t *)&v;

        // Zera o bit de sinal e os bits significativos e,
        // Mantém o expoente original e,
        // Seta apenas o LSB dos bits significativos.
        *p = (*p & ~0x807fffff) | 1;

        // Temos que subtrair 1 para eliminarmos
        // o bit implícito.
        return v – 1.0f;
        }

        A rotina acima, além de pressupor um formato, pressupõe, também que o valor informado está normalizado e que não é um NaN ou Inf.
        Aliás, a primeira rotina também pressupõe que não é um NaN ou Inf.

        Quanto a outra plataforma, eu sempre recomendo o Raspberry PI para quem quer mexer com “embarcados” (detesto esse nome!). É barato (Custa uns R$ 20,00), tem mais memória, mais poder de processamento, oferece memória de armazenamento permanente (no SDCARD) e roda sob LINUX! Ou seja, todos os padrões estão lá…

      3. Hummm… sua ideia de obter os valores arredondados próximos com precisão de 1 ULP e interpolar o valor intermediário não funcionará porque não há como representar nada menor que o bit na “última” posição (ULP)… Well… não sei exatamente como pretende usar isso, mas considere: Não temos como representar todos os números reais em base DECIMAL, escritas em folha e papel… considere os números irracionais… A inexatidão deve ser considerada por princípio em qualquer medição, por exemplo, e, por isso, temos a “notação científica”…

Deixar mensagem para joseduarteccpp Cancelar resposta