fortran 90 - representacao numeroscomputador
DESCRIPTION
TRANSCRIPT
OS DOIS TIPOS FUNDAMENTAIS DE NÚMEROS
Quando o primeiro processador FORTRAN foi desenvolvido em 1954 ele introduziu
duas maneiras bem diferentes de armazenar números e de realizar operações aritméticas. Elas
praticamente não sofreram alterações no Fortran desde aquela época e, portanto, é importante saber
como elas se diferem e como são.
Um integer é um número inteiro, sendo armazenado na memória do computador sem
qualquer parte decimal (ou fracionária). Entretanto, sempre haverá uma limitação ao tamanho dos
números inteiros devido à maneira que são armazenadas. Estes limites variam de um computador
para outro e dependem do desenho físico da memória do computador. É possível ilustrar isto
considerando um computador hipotético que armazena os seus dados na forma decimal, ao invés do
sistema binário (base 2) usado pelos computadores. Isto significa que um único dígito será
registrado por meio de um dispositivo que tem 10 estados (correspondentes a cada um dos 10
dígitos), ao invés de um dispositivo que tem apenas 2 estados (por exemplo, ligado e desligado).
Cada local na memória usada para o armazenamento de inteiros consistirá de um número fixo
destes dispositivos. Suponha que, para fins de ilustração, oito dispositivos são usados, que limitará o
tamanho do número em até 99 999 999. Ainda falta a questão do sinal dos números.
(a) 0 0 0 0 0 0 0 0 leitura inicial do odômetro
(b) 0 0 0 0 0 0 0 2 leitura após dois quilômetros
(c) 0 0 0 0 0 0 0 1 leitura após voltar um quilômetro
(d) 0 0 0 0 0 0 0 0 leitura após voltar mais um quilômetro
(e) 9 9 9 9 9 9 9 9 leitura após voltar mais um quilômetro
Figura 1: Leituras do odômetro durante um trajeto.
Suponha, também, que o dispositivo que armazenou o número inteiro é um odômetro
eletrônico (Figura 1). Se a leitura é 00 000 000 e o carro se move por 2 quilômetros à frente (ou
seja, adiciona 2 quilômetros), o odômetro mostrará 00 000 002. Entretanto, se o carro anda, em
marcha ré, por 3 quilômetros (ou seja, subtrai 3 quilômetros), o odômetro mostrará, sucessivamente,
00 000 0001, 00 000 000 e, finalmente, 99 999 999. Então, a mesma leitura é obtida para um valor
-1 assim como para +99 999 999. Pode-se adotar uma convenção que diz que os valores de 1 a 49
999 999 serão considerados positivos, enquanto que os valores de 50 000 000 a 99 999 999 serão
considerados negativos, sendo equivalentes ao intervalo -50 000 000 a -1. Quase todos os
computadores trabalham de maneira similar a esta. No caso do sistema binário, geralmente o
primeiro dígito binário (ou bit) é 1 para números negativos e 0 para números positivos.
Usando a convenção aqui adotada é possível armazenar um número inteiro que esteja
dentro do intervalo de -50 000 000 até +49 999 999 (Figura 2).
(a) 5 0 0 0 0 0 0 0 representa -50 000 000
(b) 5 0 0 0 0 0 0 1 representa -49 999 999
(c) 9 9 9 9 9 9 9 9 representa -1
(d) 0 0 0 0 0 0 0 0 representa 0
(e) 0 0 0 0 0 0 0 1 representa +1
(f) 4 9 9 9 9 9 9 9 representa +49 999 999
Figura 2: Armazenamento de inteiros de 8 dígitos.
O outro tipo de número é chamado de número real. Um número real pode ser visto
como um número que consiste de uma parte inteira e de um conjunto de números representando a
parte fracionária. Uma maneira de armazenar este tipo de número em um local da memória de oito
dígitos seria assumir que, por exemplo, os primeiros quatro dígitos estejam antes do ponto decimal
e os demais após. Entretanto, isto significaria que teríamos números variando apenas de -5000,0 a
+4999,9999, usando a mesma convenção quanto ao sinal. Fica evidente a grande restrição, sendo,
portanto, necessário outra solução para o armazenamento de um número real. Uma solução possível
seria o armazenamento de mais dígitos, mas resultaria num problema em que, em determinadas
situações, uma boa quantidade destes dígitos seria desperdiçada. Por exemplo, se 16 dígitos fossem
usados, o que resultaria num mesmo intervalo de valores dos números inteiros, mas com oito casas
decimais, o número 100 000 000,0 não poderia ser armazenado, pois precisa de nove dígitos antes
do ponto decimal, mesmo sabendo-se que não há necessidade dos dígitos após o ponto decimal.
Além disso, um número como 0,000 000 004 teria de ser tratado como zero, pois necessitaria de
nove casas decimais, mesmo que nenhum dos oito dígitos anteriores ao ponto decimal são
necessários.
Uma solução ao nosso computador hipotético seria considerar qualquer número real
não nulo como uma fração contida no intervalo 0,1 e 1,0, chamada de mantissa, que é multiplicada
ou dividida por 10, um certo número de vezes, sendo este número chamado de expoente. Então, 100
000 000,0 seria o mesmo que 0,1 x 109 e 0,000 000 004 seria o mesmo que 0,4 ÷ 108 ou 0,4 x 10-8.
(a) 0 3 4 1 3 7 0 2 representa 0,413702 x 103 = 413,702
(b) 0 4 6 8 4 9 1 5 representa -0,315085 x 104 = -3 150,85
(c) 9 7 4 1 3 7 0 2 representa 0,413702 x 10-3 = 0,000 413 702
(d) 9 8 6 8 4 9 1 5 representa -0,315 085 x 10-2 = -0,003 150 85
Figura 3: Números de ponto flutuante.
Usando este caminho, podemos definir um método de representação que dirá, por
exemplo, que os últimos seis dígitos representam a mantissa como uma fração de seis casas
decimais (com a primeira sendo não nula), enquanto que os primeiros dois dígitos representam o
expoente. A mesma técnica usada para distinguir o sinal dos valores inteiros será usada para a
mantissa e para o expoente. A Figura 3 ilustra este método, que é conhecido como representação de
ponto flutuante.
Este método de representação tem duas implicações importantes:
1. Todos os números, independente do tamanho, são armazenados com o mesmo grau de
precisão, e
2. Os limites para o tamanho dos números são muito maiores que para o caso dos inteiros.
Em nosso computador hipotético, por exemplo, os números reais podem “cair” em
qualquer lugar dentro do intervalo de -5 x 1048 a +4,99999 x 1048 e, ao mesmo tempo, o menor
número que pode ser diferenciado de zero é 0,1 x 10-50 (ou seja, 10-51). Neste computador, portanto,
o número 03413702 representa o valor real de 413,702 ou o valor inteiro de 3413702, dependendo
se ele será interpretado como um número de ponto flutuante ou um número inteiro. Note que não há
nada no número 03413702 para indicar qual das duas representações deve ser usada. Neste exemplo
hipotético, esta tarefa seria de responsabilidade do programador.
Em um computador real, este problema de distinção da representação do número
também deve ser claramente definido. No Fortran, o programador informa ao computador qual o
tipo de número a ser usado por meio da declaração de variável. Em sua forma mais simples, ela
tem a forma
TIPO :: <nome da variável>
sendo TIPO a especificação do tipo do(s) dado(s) para o(s) qual(is) deve ser reservado espaço em
memória e <nome da variável> é o nome escolhido pelo programador para se referir à variável
declarada. O exemplo abaixo
REAL :: a, b, c
declara três variáveis a, b e c que conterão números em ponto flutuante. Já o exemplo seguinte
INTEGER :: x, y, z
declara três variáveis x, y e z que conterão números inteiros.
É extremamente importante que a diferença entre um número inteiro e um número real
seja completamente apreciada:
• Um número inteiro é armazenado exatamente como ele é na memória do computador e tem
um intervalo de valores relativamente limitado: entre aproximadamente -2 x 109 e +2 x 109 e
um computador comum de 32 bits.
• Um número real, representado como um número de ponto flutuante, é armazenado como
uma aproximação a um número fixo de dígitos significativos e tem um intervalo de valores
muito grande: tipicamente entre -1038 e +1038 a sete ou oito dígitos significativos em um
computador comum de 32 bits.
NOTA IMPORTANTE: é altamente recomendado o uso da declaração IMPLICIT NONE na
primeira linha do programa logo após a declaração PROGRAM. Esta boa prática de programação
evita a utilização de declarações implícitas e confusões em programas longos.
FONTE: ELLIS, T. M. R.; PHILIPS, I. R.; LAHEY, T. M. Fortran 90 Programming. New York:
Addison-Wesley. 1994. 825p.