Bichos de X^n cabeças (parte 2/5)
O olho do dragão
Os conceitos vistos anteriormente podem parecer complexos, assim como a razão pela qual o computador opera com números binários em vez do sistema decimal. Porém devemos lembrar que o computador é uma máquina, ele não opera que nem os humanos, a partir de ações do imaginário. Suas operações são físicas, ele precisa de alguma forma atribuir em seus circuitos abertos ou fechados (0’s ou 1’s) os correspondentes aos valores e realizar eletronicamente uma movimentação destes circuitos de modo que alcance o valor correspondente.
Podemos associar o funcionamento operacional do computador de maneira similar a um ábaco romano. No ábaco atribuímos valores decimais às fileiras das contas (milésimo, centésimo, décimo, unidade, dezena, centena, milhar, dezena de milhares…). Então dentro das correspondentes fileiras decimais podemos realizar as operações matemáticas, como por exemplo, 35+357.
1. Primeiro ajustamos o ábaco para um dos valores (35 ou 357), no caso, escolhemos ajustar para 35, dessa forma, movemos 3 contas para a fileira das dezenas e 5 contas para a fileira das unidades.
2. Então acrescentamos 7 contas na fileira das unidades, mas como ela tem somente mais 5 contas a serem deslocadas, movemos as 5 (faltando 2 ainda), com as dez contas deslocadas, isto representa que o valor total ganhou mais uma dezena, assim retrocedemos as 10 contas para sua posição original, movemos na fileira das dezenas uma conta, e movemos na fileira das unidades as duas contas restantes para somarmos o 7.
3. Resolvida a operação com as unidades, agora tratamos de operar com as dezenas. Das suas dez contas da fileira, 4 já estão deslocadas (3 originalmente e 1 resultante da dezena gerada na operação 5+7 da fileira de unidades). Então, deslocamos mais 5 contas da fileira das dezenas, deixando-a com 9 contas deslocadas. Como esta fileira ainda não tem 10 contas deslocadas, nada precisamos fazer e avançamos para a próxima fileira.
4. No caso, a fileira das centenas está com nenhuma conta deslocada (pois 35 é menor do que 100), assim, movemos as 3 contas equivalentes à centena do número 357, fazendo com que agora a fileira das centenas tenha 3 contas deslocadas. Como a fileira ainda tem menos do que 10 contas deslocadas, nada precisamos fazer.
5. Não restando mais operações a serem realizadas, lemos o resultado a partir da maior casa decimal até a menor, ou seja, 300+90+2=392.
Perceba que todo este processo foi uma ação mecânica e que o ábaco foi desenvolvido especificamente para operar corretamente no nosso sistema decimal. Para entender de maneira mais ampla a operacionalidade mecânica do ábaco, realizaremos esta mesma operação (35+357) em um “ábaco especial” com N fileiras, cada uma possuindo somente duas contas. Primeiro precisamos entender como funcionam as fileiras deste ábaco. Se deslocarmos as duas contas de uma fileira, de maneira similar ao ábaco romano, devemos deslocar uma conta da próxima fileira, retroceder todas as contas da fileira atual e continuar a operação. Assim traçando os correspondentes ao nosso sistema decimal cada fileira isolada pode valer respectivamente:
1a fileira → 0 ou 1.
2a fileira → 0 ou 2.
3a fileira → 0 ou 4.
4a fileira → 0 ou 8.
5a fileira → 0 ou 16.
6a fileira → 0 ou 32.
7a fileira → 0 ou 64.
8a fileira → 0 ou 128.
9a fileira → 0 ou 256.
Dessa forma, para descrevermos neste ábaco especial o número 35, precisamos: deslocar na 6a fileira uma conta (assim o ábaco registrará o número 32); deslocar na 2a fileira uma conta (assim o ábaco registrará o número 32+2); deslocar na 1a fileira uma conta (assim o ábaco registrará o número 32+2+1).
De maneira similar ao ábaco romano, agora somamos com o 357, que neste ábaco especial seria escrito como 256+64+32+4+1 (9a fileira com 1 conta, 7a fileira com 1 conta, 6a fileira com 1 conta, 3a fileira com 1 conta, 1a fileira com 1 conta). Então, podemos começar a operação:
1. A primeira fileira tem 2 contas, então a retrocedemos e deslocamos uma conta na segunda fileira.
2. A segunda fileira tem 2 contas, então a retrocedemos e deslocamos uma conta para a terceira fileira.
3. A terceira fileira tem 2 contas, então a retrocedemos e deslocamos uma conta para a quarta fileira.
4. A quarta fileira só tem uma conta, então nada fazemos e avançamos.
5. A quinta fileira não tem nenhuma conta deslocada, então nada fazemos e avançamos.
6. A sexta fileira tem 2 contas, então a retrocedemos e deslocamos uma conta para a sétima fileira.
7. A sétima fileira tem 2 contas, então a retrocedemos e deslocamos uma conta para a oitava fileira.
8. A oitava fileira só tem uma conta, então nada fazemos e avançamos.
9. A nona fileira só tem uma conta, então nada fazemos.
10. Como não há mais contas após esta fileira, encerramos a operação e lemos o resultado: 256+128+0+0+0+8+0+0+0=392.
Perceba que apesar da aparente complexidade, a maneira como estas contas foram operadas envolveu somente representações físicas e processos mecânicos. O computador opera de maneira análoga, porém em vez de usar os dedos para movimentar as contas, ele utiliza eletricidade para abrir (0) e fechar circuitos (1).
Mas ainda que o computador nestas operações seja muito mais rápido que os seres humanos, ele é limitado a essa representação numérica. Tendo extrema dificuldade em realizar operações mais abstratas com as quais nós estamos habituados. Uma destas dificuldades envolve a conversão de bases, e por esta razão é preferível que ele opere dentro da base binária.
Pois pode não parecer, mas os computadores são complexas calculadoras com certos probleminhas na hora de fazer alguns cálculos. Eles são excelentes com cálculos em base 2, mas alguns números que para nós são simples, para o computador pode ser bem difícil de representar na base 2, como por exemplo o 0,2.
Simplesmente o computador não consegue tratá-lo como um número exato e isto gera uma consequência peculiar quando pedimos que calcule o resultado abaixo.
1 – 0,2 – 0,2 – 0,2 – 0,2 – 0,2
Uma criança que aprendeu fazer contas com vírgulas, ou que interprete esta operação como se fosse 1 real menos 20 centavos menos 20 centavos menos 20 centavos menos 20 centavos menos 20 centavos, saberia que a resposta final é 0. E 0 multiplicado por 100.000.000.000.000.000 deverá ser 0. Mas quando eu realizo esta mesma operação no software R, um conceituado software de estatística (outros softwares de matemática também apresentariam este mesmo resultado), encontro que a resposta é 5,551115.
Exemplo desta operação no software R
Mas por que isto? Será que encontramos uma falha na Matrix? E se este erro é conhecido, por que ninguém o conserta? A resposta é um pouco mais complicada do que um simples reparo no código. O computador como um todo trabalha com as informações na forma de 0’s e 1’s, e suas operações são realizadas desse modo (como mostrado anteriormente com o exemplo do ábaco especial). Infelizmente, em nossos sistemas numéricos fazemos operações de difícil representação física e mecânica com um sistema de circuitos abertos e fechados e bem mais complexas do que aquelas que um computador utiliza.
O computador apesar de parecer limitado, conta com a vantagem de ser extremamente rápido e armazenar muita informação. Assim, uma operação que sequer conseguimos imaginar como processos de “cálculos” (por exemplo, executar um vídeo, rodar um jogo, tocar uma música), o computador consegue executar com tamanha facilidade se comparado com realizar algumas operações tidas para nós como “relativamente simples”, como operar números Irracionais (por exemplo, raízes quadradas de números primos).
Mesmo a simples representação do número 0,2 (no sistema decimal), é uma expressão de infinitos termos quando utilizamos o sistema binário, e os computadores não se dão bem com conceitos abstratos como expressões de infinitos termos. Mesmo a ideia de números Irracionais, os computadores fazem uma salada para trabalhar com eles. Assim, o número 0,2 aparece pro computador como um número de infinitos termos na base 2, e na hora de operá-lo, opta por arredondamentos. Ele tenta minimizar o erro ao máximo pra chegar na resposta exata, tanto que a resposta encontrada é bem próximo de 0, algo na faixa de 0,000000000000000005. Mas embora próximo de 0, ainda não é 0. E por isto, quando multiplicamos por algo muito grande, dá um número bem diferente de 0.