domingo, 14 de maio de 2023

Padrões numéricos nos computadores

Como os números são tão importantes para os computadores, veremos neste artigo os tipos de números com que nossos PCs podem trabalhar.

Código binário
Imagem ilustrativa: números binários

Vamos iniciar com os formatos numéricos simples que fazem parte do repertório básico e números do PC — os números com os quais o PC tem uma capacidade nativa para trabalhar.

Você pode ficar surpreso ao notar que as capacidades naturais do PC só permitem que ele trabalhe com números inteiros — realmente chamados inteiros na terminologia matemática — e com números um tanto pequenos.

Basicamente, existem apenas duas variedades de números com que o PC tem uma capacidade inerente, ou embutida, de trabalhar — inteiros com um byte de tamanho e inteiros com dois bytes, ou uma palavra. Com a assistência de programas inteligentes, o PC pode trabalhar com números maiores; por exemplo, combinando duas palavras de 16 bits em um número maior de 32 bits. Mas isso só pode ser feito com software especial. Quando falamos sobre as habilidades naturais do PC, estamos falando apenas em aritmética de 8 e 16 bits.

Que tamanho podem ter números de 8 e 16 bits? Na verdade, não muita coisa. Há apenas 256 valores distintos que um byte de 8 bits pode ter — 2 elevado à oitava potência, que é 256. Uma palavra de 16 bits, 2 bytes, pode ter dois valores distintos de potência dezesseis: 65.536 ao todo. Isso define um limite um tanto pequeno para a faixa de números com que podemos trabalhar usando bytes e palavras.

Cada um desses dois tamanhos de inteiro pode ser interpretado de duas formas, o que duplica o número de formatos numéricos diferentes que podemos ter. As duas interpretações dependem de querermos permitir números negativos ou não. Se não quisermos trabalhar com números negativos, então a faixa inteira de valores de cada um desses dois tamanhos de inteiro pode ser dedicada a números positivos. Para um inteiro de tamanho de byte, a faixa de números pode variar de 0 255, usando todos os padrões de bit distintos; para uma palavra de 2 bytes, a faixa de inteiros positivos é de 0 a 65.535.

Por outro lado, se precisarmos também de números negativos, metade da faixa de valores será dedicada a negativos, e só poderemos ter números com a metade do valor total. No caso de bytes, a faixa de valores é de -128 a + 127, incluindo o 0; para palavras (2 bytes), a faixa é de -32.768 a +32.767, incluindo o 0. Não temos que escolher a faixa; logo, não podemos ter uma faixa maior de números positivos retirando alguns valores da faixa de negativos. Note que a faixa de números negativos é um a mais que a faixa de positivos: existe um -128 mas não existe um +128; este é apenas um subproduto incomum da forma como os números negativos são manuseados.

O microprocessador dentro de nossos PCs pode fazer toda a sua aritmética padrão — somar, subtrair, multiplicar e dividir — sobre esses quatro formatos inteiros, mas essa é a extensão de todo o cálculo básico que o PC pode realizar.

Como você pode imaginar, a maioria dos programas não poderá passar com apenas esses quatro formatos inteiros simples para seus números. Outros formatos, por exemplo, precisão simples e precisão dupla, precisam ser criados indo-se além das habilidades comuns do PC.

Como são representados os negativos

Os inteiros negativos são representados dentro do PC em um formato conhecido como complemento de dois. Este é um esquema comumente usado em computadores e bastante relacionado aos truques de "vai-um" que aprendemos quando começamos a somar e subtrair em decimal. É mais fácil explicar com um exemplo feito com números decimais com três dígitos de extensão; isso é semelhante aos números binários de 1 ou 2 bytes de tamanho fixo que o PC usa para calcular.

Em nossos números decimais de três dígitos, zero é escrito como 000 e um como 001. Se subtrairmos 001 de 001, obtemos 000. Como podemos subtrair 001 novamente para obter menos um? Podemos fazer isso pedindo emprestado de um dígito um imaginário na quarta casa. Pensamos em 000 (e todos os outros números positivos) como tendo um dígito 1 na frente, que pode ser emprestado da seguinte forma:

Como são representados os negativos nos computadores.

Assim, menos um é representado como 999; menos dois é 998, e assim por diante.

Os números positivos começam em 000, 001, 002 e vão até 499. Os números negativos vão de 999 (nosso -1), 998 (-2) e continuam descendo até 500, que na realidade significa menos quinhentos. O mesmo truque funciona com os números binários dentro do nosso computador.

Observe que o valor de um número pode depender de como o interpretamos, sinalizado ou não-sinalizado. Como número sinalizado, 999 significa menos um; como número não-sinalizado, ele significa novecentos e noventa e nove.

Números quentes

A maioria das necessidades de computação vai além dos simples vai além dos simples inteiros que são nativos do PC. Fazendo planejamento financeiro com um programa de planilha, executando cálculos de engenharia ou apenas verificando nosso saldo bancário, precisamos de números mais poderosos do que os inteiros que vimos até aqui. Lidando com dinheiro, os inteiros que discutimos até aqui não poderiam manusear algo maior do que US$655,35, quando trabalhamos até os centavos. Assim, precisamos de alguns números mais "quentes".

Há duas formas do PC poder nos dar uma faixa mais ampla de números, e duas formas de calcular com esses números. Vejamos primeiro os tipos de números, e depois como esses números podem ser calculados.

A primeira forma de estender a faixa de números com que nossos PCs podem lidar é simplesmente fazendo inteiros mais longos. Já vimos inteiros de 1 e 2 bytes. Podemos continuar com essa ideia e usar inteiros de três quatro ou mais bytes. Qualquer coisa é possível, mas o tamanho extra mais prático para inteiros é quatro bytes, e isso nos dá uma faixa muito maior de números, até mais ou menos 2.000.000.000. Isso nos ajuda bastante, mas não faz tudo.

Para lidar com quantidades fracionárias, além de números extremamente longos, nossos computadores usam um conceito conhecido como ponto flutuante. O ponto flutuante funciona semelhantemente a algo que você pode ter aprendido na escola, chamado notação científica ou de engenharia. Neste esquema, os números são representados em duas partes — uma parte representa os dígitos que compõem o número; a outra parte indica onde o ponto decimal está localizado.

Como o ponto decimal pode ser movido livremente, os números de ponto flutuante podem ser muito grandes — astronômicos, como dizem — ou podem ser frações extremamente pequenas. Não importa o tamanho que os números possam ter, eles são precisos, pois os dígitos que determinam a exatidão, ou precisão do número, são independentes dos números que especificam onde está o ponto decimal.

Em algumas linguagens de programação, os estilos de números conhecidos como precisão simples e precisão dupla são formatos de ponto flutuante. A diferença entre eles é que os números de precisão dupla permitem mais dígitos de precisão.

Os programas de planilha também usam o ponto flutuante para representarem seus números, pois ele gera grande flexibilidade e maior precisão nos cálculos executados.

Há duas formas — inteiros longos e ponto flutuante — do esquema numérico do PC ser estendido. Entretanto, como dissemos, o microprocessador do PC, seu "cérebro", só tem a capacidade natural de trabalhar com os quatro formatos inteiros simples. Como podemos fazer qualquer aritmética nesses formatos estendidos? Há duas formas: por meio de software e por meio de hardware.

O software é a solução mais comum. Toda linguagem de programação e praticamente todo programa de cálculo, incluindo planilhas, contêm rotinas de programa que podem fazer o trabalho de realizar cálculos em números com formato de ponto flutuante ou inteiros longos. Essas sub-rotinas usam a aritmética básica do PC e as habilidades lógicas para montarem blocos que executarão cálculos mais complexos, necessários para o trabalho com esses outros formatos numéricos. No entanto, isso tem um custo. Enquanto o PC pode realizar seus próprios cálculos inteiros muito rapidamente, uma sub-rotina de ponto flutuante talvez precise de 100 vezes mais para fazer um cálculo equivalente, simplesmente porque a sub-rotina precise realizar seu trabalho usando cerca de 100 passos elementares.

Para muitas finalidades, a velocidade desses cálculos baseados no software ainda é bastante rápida, mas não tão rápida quanto poderia ser. Para ganhar mais velocidade existe uma outra forma de cálculo, uma solução no hardware. O processador dentro do nosso PC tem um acompanhante, o coprocessador, projetado para uma única tarefa: cálculos matemáticos (ponto flutuante) rápidos. Com o coprocessador e um programa que saiba utilizá-lo, a velocidade e precisão dos cálculos de ponto flutuante pode ser extremamente melhorada.

Vale a pena lembrar que muitos programas simplesmente não fazem qualquer cálculo de ponto flutuante. Os programas de processamento de texto, por exemplo, não têm utilidade para números de ponto flutuante. Estes programas não são atrasados por sub-rotinas de ponto flutuante, ou agilizados pelo coprocessador. Até mesmo nem todos os programas que realizam cálculos em ponto flutuante tiram proveito de um coprocessador. Os programas de planilha, por outro lado, usam o coprocessador sempre que ele pode ajudar.

Diferente dos formatos inteiros e diferente do conjunto de caracteres do PC, não existem padrões universais para que tipos de inteiros longos ou número de ponto flutuante possam ser usados por um programa. Não podemos mostrar um resumo de todos os formatos numéricos estendidos, mas podemos dar uma olhada nos mais comuns.

Primeiro vejamos os inteiros longos. Nossos programas poderiam trabalhar com qualquer número de bytes para criar um inteiro longo, mas um tamanho é mais comum: inteiros sinalizados de 4 bytes. Esses números podem variar até ligeiramente mais do que ± 2.000.000.000. Os coprocessadores também são projetados para trabalharem com inteiros de 4 e 8 bytes; estes podem chegar até a 9 bilhões de bilhões. Os coprocessadores também podem trabalhar com um inteiro decimal especial que mantêm 18 dígitos decimais, que também está na faixa de bilhões de bilhões. O formato decimal especial que os coprocessadores usam é um exemplo único de orientação decimal; tudo o mais que os nossos computadores fazem é essencialmente binário por natureza.

Vejamos o que o ponto flutuante pode fazer por nós. Os dois tamanhos mais comuns de números de ponto flutuante ocupam quatro ou oito bytes de armazenamento, assim como os formatos de precisão simples e dupla de algumas linguagens. Os formatos de ponto flutuante de 4 bytes nos dão o equivalente de cerca de seis dígitos decimais de precisão, e os formatos de 8 bytes nos dão cerca de 16 dígitos decimais de precisão. A faixa — o tamanho que os números podem ter — está na casa dos 10 elevado à trigésima oitava potência. Como há muitas formas diferentes de codificar um número de ponto flutuante, existe alguma variedade na quantidade de precisão e faixa que podemos obter no mesmo tamanho geral de números de ponto flutuante, de modo que os valores dados aqui são apenas aproximados. Os coprocessadores também podem trabalhar com um formato ligeiramente maior, que ocupa 10 bytes; ele nos dá cerca de 18 dígitos de precisão.

O tipo de número com que podemos trabalhar depende do tipo de programa que estamos usando. O que descrevemos aqui aplica-se à maioria das linguagens de programação, mas programas especializados podem ter seus formatos numéricos únicos. Por exemplo, é comum que os programas de planilha usem suas próprias variações sobre a ideia de números de ponto flutuante. Mas o que foi descrito aqui lhe dará uma ideia clara sobre os tipos de números "quentes" que podem estar à nossa disposição quando trabalhamos com nossos computadores.

Nenhum comentário:

Postar um comentário