Posts Tagged ‘programação’

Ulrich Drepper sobre memória para programadores

Saturday, October 13th, 2007

Ulrich Drepper, programador do Kernel do Linux iniciou uma série de 7 artigos, em inglês, sobre memória na Linux Weekly News. Os artigos da área de kernel da LWN são leitura obrigatória para quem se interessa sobre programação em baixo nível.

Desta vez, ele fala sobre memórias DRAM, SDRAM, DDR e barramentos do ponto de vista de hardware.

As continuações devem ser sobre memória cache, memória virtual, NUMA (non-uniform memory access), instruções para programadores, ferramentas e tecnologia futura e devem ser publicadas com um intervalo de 1 a 2 semanas.

O capítulo 6, de instruções para programadores é o artigo principal, e vai utilizar as informações das outras para mostrar o que bons programadores, interessados em performance, devem saber. Aliás, se você está interessado em programar com alta performance em mente, eu recomendo fortemente o livro High Performance Computing, que eu acabei de descobrir que está esgotado.

Bug estranho no Excel

Wednesday, September 26th, 2007

Continuando a discussão sobre ponto flutuante do post anterior, e aumentando minhas dúvidas sobre a humanidade. Alguém citou um exemplo de erro crasso é o bug da multiplicação do Excel, de que eu não estava ciente, mas eu abri um Excel 2007 e testei.

O bug é fácil de reproduzir.

Em uma célula qualquer, digamos A1, coloque o valor =850*77,1. Ele vai apresentar como resultado o valor 100000, quando o valor correto seria 65535. Programadores que se prezam vão identificar esse número como sendo especial.

Escreva, em outra célula (A2) uma referência à célula anterior, subtraindo 1, por exemplo, =A1 - 1. O resultado vai ser 65534. Ou seja, para o excel 100000 - 1 = 65534

Em uma terceira célula (A3), insira uma fórmula com a primeira célula somada a 1, por exemplo, =A1+1. O resultado vai ser 100001. Estranho, mas consistente com o primeiro resultado.

Para finalizar, em uma quarta célula (A4), insira a subtração da terceira célula e a segunda: =A3-A2. O resultado? 2. Ou seja, 100001 - 65534 = 2.

Representação de ponto flutuante

Tuesday, September 25th, 2007

Double precision floating point structure
Isto é de programação em nível meio baixo, então se você não gosta de baixo nível, pode ser melhor pular este artigo.

Em uma lista da qual eu faço parte, mas que pelas próprias regras não pode ser nomeada (um tipo de lista Voldemort), alguém mencionou que na ferramenta de calculadora do Mac OS X, ao tentar executar a seguinte operação:

118398.42 * 2

Obtém-se o seguinte resultado:

236796.839999999997

Na hora eu lembrei das restrições de ponto flutuante com relação à incapacidade de expressar boa parte dos números, como no resultado acima. Um teste no excel deu o resultado correto: 236796.84, mas imaginei que isso fosse porque o Excel talvez utilize ponto fixo para essas contas, já que trata de dados financeiros, para os quais arredondamento é proibido.

Acontece que alguém surgiu com um algoritmo que eu nunca tinha visto e que realmente faz todo o sentido: ao invés de expressar todos os dígitos possíveis do número, simplesmente expresse o número mais simples cuja representação em ponto flutuante é equivalente ao número dado.

Se você fizer a conta, vai ver que 236796.84 == 236796.839999999997 e portanto e uma representação perfeitamente razoável para esse número em ponto flutuante. Então, por que motivo nós não aprendemos a fazer isso na faculdade ou nos cursos de computação? Por que eu nunca pensei nisso como sendo um problema?

Uma implementação em python está abaixo, bem como uma certa discussão sobre o motivo, e implementações que fazem isso corretamente (javascript, por incrível que pareça, faz). O autor acredita que parte da culpa é da restrição de acesso aos artigos da ACM:

Python: poor printing of floating point « code monk