EA869 Representação Numérica - Unicamplboccato/topico_2... · Elimina o problema da redundância...
Transcript of EA869 Representação Numérica - Unicamplboccato/topico_2... · Elimina o problema da redundância...
EA869 Representação Numérica
Faculdade de Engenharia Elétrica e de Computação (FEEC)
Universidade Estadual de Campinas (UNICAMP)
Prof. Levy Boccato
1
Introdução Toda informação manipulada por um computador digital, seja um
número correspondente ao valor de uma medida do ambiente, seja uma letra presente em uma mensagem de texto, é representada internamente por uma sequência de bits (binary digits).
A representação na base 2 se tornou a opção dominante devido aos avanços da eletrônica baseada em dispositivos semicondutores.
Neste tópico, abordaremos a questão de como o computador representa e manipula números.
Uma vez vistos estes conceitos, estaremos prontos para iniciar o estudo de arquitetura de computadores, começando pelo principal elemento, a saber, o processador.
2
Introdução Sinal digital:
Nível de tensão cujo valor exato não é determinante para o comportamento do circuito, apenas a faixa à qual ele pertence.
3
Nível alto (VH) – Bit 1
Nível baixo (VL) – Bit 0
Região proibida
Introdução Problema: estamos habituados a representar números na base
decimal. Porém, o computador lida com grandezas representadas como sequências de bits (base 2).
Fazer manipulações com números binários pode ser custoso e pouco intuitivo para nós.
Por isso, é necessário saber como converter números binários em outras bases mais familiares.
Duas bases são de particular interesse:
Decimal: por motivos óbvios.
Hexadecimal: facilita a representação de sequências maiores de bits (útil, por exemplo, quando estamos trabalhando com arquiteturas de 16 ou 32 bits).
4
11111111111111112 6553510 FFFF16
Conversão de base Conversão de base:
Exemplos: A4 = 10×161 + 4×160 = 16410
00110111 = 1×25 + 1×24 + 1×22 + 1×21 + 1×20 = 5510
Binário para hexadecimal:
0001 1101 0110 1110
5
A transformação de um número representado em uma base genérica para a base decimal é feita segundo a expressão: n10 = di . b
i + . . . . + d1 . b1 + d0
onde n10 é o número na base 10 correspondente à sequência de i+1 dígitos di na base b.
1 D 6 E
Números inteiros A conversão de base que vimos nos leva a interpretar a sequência
de bits como sendo a representação de um número natural.
Como podemos representar números inteiros (i.e., com sinal)?
6
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Só valores positivos
(Naturais)
Sinal e Magnitude
Qual a vantagem e a desvantagem desta
representação?
Vantagem Relação natural
com o uso comum
- Dois circuitos (soma e subtração); - Duas representações para o zero;
3 bits → 23 → 8 números
Bit mais significativo expressa o sinal: 0 – positivo 1 - negativo
Desvantagem
0
1
2
3
4
5
6
7
0
1
2
3
0
-1
-2
-3
Números inteiros A fim de contornar a necessidade de se ter dois circuitos
aritméticos – um para a adição, outro para subtração –, trabalha-se com a representação por complemento.
Neste contexto, a subtração entre dois números equivale à soma do primeiro com o complemento do segundo.
Complemento de 1:
Regra: o complemento de x (n bits, positivo) é dado por xc = 2n – 1 – x.
Exemplo: Qual o complemento de 1 do número 1?
7
111
001
110
-
Maior número representável
Números inteiros Complemento de 1:
Usando 3 bits, teríamos os seguintes números representados.
Para obter diretamente a cadeia binária do complemento, basta inverter todos os bits.
O bit mais significativo serve para indicar o sinal (exceto do zero).
8
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
Qual o problema dessa representação?
Redundância do zero
0
1
2
3
-3
-2
-1
0
Números inteiros Complemento de 2:
Elimina o problema da redundância da representação do número 0, possibilitando a representação de um valor a mais.
Regra: o complemento de x (n bits, positivo) é dado por xc = 2n – x.
Exemplo: Qual o complemento de 2 do número 3?
-3 = 8 – 3 = 5
9
1000
011
101
-
Números inteiros Complemento de 2:
Para obter diretamente a cadeia binária do complemento de 2, basta inverter todos os bits e somar um ao valor.
O bit mais significativo também indica o sinal.
10
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
0
1
2
3
-4
-3
-2
-1
Positivos representáveis com n bits: 0 a 2n-1 - 1 Negativos representáveis com n bits: -1 a –2n-1
11
Números reais Como representar números reais no computador?
Exemplos: 0,33
2,71828 (e)
3.847.992.023,45
Problema: pelo argumento diagonal de Cantor, sabemos que a cardinalidade do conjunto dos números reais ultrapassa a dos naturais. Logo, não é possível computar todos os números reais.
Consequência: o que se processa em computador necessariamente é uma aproximação do conjunto dos números reais.
Duas questões, portanto, são bastante importantes na escolha de uma representação para esta classe de números:
Qual a faixa de valores representáveis?
Qual a precisão que se atinge com a representação adotada?
12
Números reais Como representar números reais no computador?
Primeira abordagem: representar um número real como um número natural.
Ideia: a parte fracionária (após o ponto decimal) é representada por um número fixo de dígitos binários – quanto maior o número de bits, maior a precisão desta representação.
13
Números reais Ponto fixo
Esquema de conversão:
Multiplicação do valor real por 2d, onde d é o número de bits da parte fracionária.
Arredondamento para o valor inteiro mais próximo.
Exemplo: representação de 3,14 como um número inteiro de 8 bits com 4 bits para a parte fracionária.
3,14 × 24 = 50,24 ≅ 50 = 0011 0010
0 0 1 0
2-1 2-2 2-3 2-4
0,5 0,25 0,125 0,0625
0 0 1 1
23 22 21 20
,
8 4 2 1 Pesos
14
Ponto Fixo Operações com representação em ponto fixo
Adição: equivalente à soma de inteiros Exemplo: 3,14 + 2,71 = 5,85
3,14 – representado como 0011 0010 = 50
2,71 – representado como 0010 1011 = 43
50 + 43 = 93 – 0101 1101
A cadeia binária 0101 1101 corresponde a
Multiplicação: equivalente à multiplicação de inteiros com subsequente deslocamento para a direita do resultado conforme o número de bits que compõem a parte fracionária. Exemplo: 3,14 × 2,71 = 8,5094
50 × 43 = 2150 = 1000 0110 0110
Deslocamento para a direita de 4 bits: 1000 0110
8125,52120212121202120 43210123
37582021212020202021 43210123 ,
Ponto Flutuante A representação em ponto flutuante é o padrão adotado pelos
sistemas computacionais para expressar um número real.
Notação científica:
Um único dígito à esquerda da vírgula (ponto decimal ou binário).
Normalização: o único dígito antes da vírgula sempre é diferente de zero.
Exemplos: 4,0 × 10-9 (Normalizado)
1,011 × 2-8 (Normalizado)
0,1011 × 2-7 (Não-normalizado)
15
Ponto Flutuante Vantagens da notação científica normalizada:
Simplifica a troca de dados que incluem números representados
em ponto flutuante.
Simplifica os algoritmos para aritmética de ponto flutuante.
Aumenta a precisão dos números que podem ser armazenados em uma palavra.
0’s desnecessários são substituídos por dígitos verdadeiros à direita da vírgula.
16
Ponto Flutuante Representação (normalizada):
1,xxxxxx2 × 2yyyy
O primeiro bit indica o sinal do número.
O campo seguinte contém os bits referentes ao expoente (positivo ou negativo), cujo tamanho afeta decisivamente a faixa de números representáveis.
O último campo, denominado fração (mantissa ou magnitude), contém os dígitos válidos na forma normalizada. O tamanho deste campo determina a precisão da representação.
Geral: (-1)S × F × 2E
17
yyyy 1,xxxxxx2
Sinal Expoente Fração, Mantissa ou Magnitude
k bits m bits
Ponto Flutuante A representação em ponto flutuante está sujeita à ocorrência
de overflow: Quando o expoente se torna excessivamente grande, não podendo ser
representado no campo correspondente, temos um overflow.
Há, também, a possibilidade de outro evento excepcional, denominado underflow: Quando o valor calculado se torna tão pequeno que não pode ser
representado, temos um underflow.
Ou, equivalentemente, um underflow ocorre quando o expoente negativo para a representação do número se torna muito grande e não cabe no campo correspondente.
18
Ponto Flutuante Solução de compromisso:
Aumentar o número de bits destinados ao expoente amplia a faixa de números que podem ser representados. Além disso, reduz a possibilidade de ocorrência de overflow / underflow.
Aumentar o número de bits destinados à mantissa melhora a precisão ou a capacidade de aproximação associada à representação adotada.
Limitação: tamanho da palavra (memória / registrador).
19
Ponto Flutuante Padrão IEEE 754 (1985):
Formato simples (single):
Formato duplo (double):
20
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
S Expoente Fração
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
S Expoente Fração
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Fração (continuação)
11 bits 52 bits
8 bits 23 bits
Ponto Flutuante Padrão IEEE 754 (1985):
Bit escondido: dado que o bit mais significativo guardado na mantissa sempre seria igual a 1 – por causa da normalização –, ele não precisa ser armazenado junto com os demais bits, i.e., ele pode ser implícito à representação.
Deste modo, no formato single, teremos efetivamente 24 bits de mantissa (1 implícito e 23 armazenados). No caso double, serão 53 bits.
21
Ponto Flutuante Padrão IEEE 754 (1985):
Para facilitar a comparação entre dois números representados em ponto flutuante, o expoente é armazenado antes da mantissa.
Contudo, expoentes negativos complicam um pouco a comparação, pois à primeira vista se parecem com valores de maior magnitude (sem sinal) – lembrar que o bit mais significativo é igual a 1.
Desejável: maior expoente positivo = 11111
menor expoente negativo = 00000
Esta convenção nos leva à notação polarizada, na qual um bias é subtraído do expoente (sem sinal) armazenado para determinar o valor real deste campo.
Valor escolhido: bias = 127 (single)
bias = 1023 (double)
22
Ponto Flutuante Padrão IEEE 754 (1985):
Com estas modificações, a representação em ponto flutuante segundo o padrão IEEE 754 é expressa da seguinte forma:
(-1)S × (1 + mantissa) × 2(expoente – bias)
Expandindo em função dos bits da mantissa b0, b1, b2, :
(-1)S × (1 +(b1 × 2-1) + (b2 × 2-2) + (b3 × 2-3) + ) × 2(expoente – bias)
Ou, equivalentemente:
(-1)S × (1 +((b1 × 222) + (b2 × 221) + + (b23 × 20)) × 2-23) × 2(expoente – bias)
23
Ponto Flutuante Padrão IEEE 754 (1985):
Números positivos:
Números negativos:
24
0 1,111... × 2-126 1,000... × 2-126
Precisão: 2-23× 2-126
Menor expoente armazenado: 1
1,111... × 2127 1,000... × 2127
Precisão: 2-23× 2127
Maior expoente armazenado: 254
0
-1,000... × 2127 -1,111... × 2127
Precisão: 2-23× 2127
-1,000... × 2-126 -1,111... × 2-126
Precisão: 2-23× 2-126
Ponto Flutuante Padrão IEEE 754 (1985):
Representação do zero: Menor expoente: 000...0
Menor fração ou mantissa: 000...0
Símbolos especiais:
O maior expoente (255) é reservado para símbolos especiais.
Por exemplo, em vez de uma divisão por zero causar uma exceção, um símbolo +∞ ou -∞ pode ser retornado. Neste caso, a representação adotada é: expoente = 255 e fração = 000...0
Operações inválidas como 0 / 0 ou uma subtração entre dois valores infinitos produzem um símbolo NaN (not a number). A representação adotada para esta condição é: expoente = 255 e fração = valor não-nulo.
25
Ponto Flutuante Padrão IEEE 754 (1985):
Em vez de haver um vazio (gap) entre o 0 e o menor valor normalizado, o padrão IEEE 754 aceita os chamados números não-normalizados.
Características: Expoente armazenado é o mesmo que o utilizado para o valor zero (00...0).
Fração não-nula.
Correspondência: (-1)S × (0 + fração) × 2-126
Exemplo: Menor valor não-normalizado (single): 0,000...001 × 2-126 = 2-149.
Maior valor não-normalizado (single): 0,111...111 × 2-126 = (1 – 2-23) × 2-126.
26
Ponto Flutuante Exemplo:
k = 4 e m = 2
Neste caso, o bias é igual a 7.
Expoente = 0 – reservado para o 0 e para os números não-normalizados.
1,00 × 2-6 = 0,01562500
1,01 × 2-6 = 0,01953125
1,10 × 2-6 = 0,02343750
1,11 × 2-6 = 0,02734375
1,00 × 27 = 128
1,01 × 27 = 160
1,10 × 27 = 192
1,11 × 27 = 224
Expoente = 15 – reservado para ±∞ e NaN.
27
Menor expoente válido
Maior expoente válido
Ponto Flutuante Padrão IEEE 754 (1985):
Quadro resumo:
28
Ponto Flutuante Padrão IEEE 754 (1985):
Exemplo: decimal para ponto flutuante
(1) 0,625 – base decimal
(2) 0,1012 – base 2
(3) Normalizando: 1,01 × 2-1
(4) Sinal: 0
(5) Expoente: -1 + 127 = 126
(6) Fração: 01000...0
(7) Palavra armazenada: 0x3f20 0000
29
0 0 1 1 1 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S Expoente Fração
Ponto Flutuante Padrão IEEE 754 (1985):
Exemplo: ponto flutuante para decimal
(1) Palavra armazenada: 0xc1b2 4000
(2) Sinal = 1 – número negativo
(3) Expoente = 131 – removendo a polarização, obtemos o expoente verdadeiro: 131 – 127 = 4.
(4) Fração = 2-2 + 2-3 + 2-6 + 2-9
(5) Valor: (-1)S × (1 + fração) × 2(expoente – bias)
(-1) × (1 + 0,392578125) × 24 = - 22,28125
30
1 1 0 0 0 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S Expoente Fração
Ponto Flutuante Adição:
Passo 1: alinhar o ponto binário (decimal) tendo como referência o número com maior expoente.
Para isto, basta deslocar o significando do menor número para a direita até que seu expoente corrigido se torne equivalente à referência.
Passo 2: efetuar a operação de adição.
Passo 3: normalizar o resultado.
Passo 4: arredondar (truncar) para que valor obtido possua exatamente o número de dígitos permitido.
Passo 5: caso necessário, efetuar nova normalização.
31
Ponto Flutuante Adição:
32
Ponto Flutuante Adição:
Exemplo: 0,5 – 0,4375
Usando 4 bits para a representação:
0,5 = 0,1 × 20 = 1,000 × 2-1
-0,4375 = - 0,0111 × 20 = -1,110 × 2-2
O significando do número com menor expoente (no caso, -1,110) é deslocado para a direita até que seu expoente atinja o valor -1.
-1,110 × 2-2 = -0,111 × 2-1
Soma:
1,000 × 2-1 – 0,111 × 2-1 = 0,001 × 2-1
33
Ponto Flutuante Adição:
Exemplo: 0,5 – 0,4375
Normalize a soma, verificando a ocorrência de overflow ou underflow.
0,001 × 2-1 = 1,000 × 2-4
Arrendonde o resultado (neste caso em particular, não há necessidade de mudança).
1,000 × 2-4 = 0,0625.
34
Ponto Flutuante Multiplicação:
Passo 1: calcular o expoente.
Basta somar os expoentes armazenados!?
Passo 2: multiplicar os significandos.
Passo 3: normalizar o resultado.
Passo 4: arredondar (truncar).
Isto é feito para que valor obtido possua exatamente o número de dígitos permitido. Se necessário, efetuar nova normalização.
Passo 5: determinar o sinal do resultado.
35
É preciso subtrair a polarização.
Ponto Flutuante Multiplicação:
36
Ponto Flutuante Multiplicação:
Exemplo: 0,5 × (-0,4375)
Usando 4 bits para a representação:
0,5 = 0,1 × 20 = 1,000 × 2-1
-0,4375 = - 0,0111 × 20 = -1,110 × 2-2
Somando os expoentes sem bias:
-1 + (-2) = -3
Multiplicando os significandos:
1,000 × 1,110 = 1,110000
Podemos manter apenas 4 bits – 1,110 × 2-3
37
Ponto Flutuante Multiplicação:
Exemplo: 0,5 × (-0,4375)
O produto já está normalizado e não houve overflow / underflow.
Não há necessidade de arredondar.
Sinal: como os sinais dos operandos eram diferentes, o resultado será negativo.
-1,110 × 2-3
Convertendo para decimal: -1,110 × 2-3 = -0,21875
38
Ponto Flutuante Bits de guarda e arredondamento:
Para arredondar os números de maneira mais precisa, o hardware pode incluir bits extras nos cálculos.
O padrão IEEE 574 prevê o uso de dois bits extras à direita durante as somas intermediárias, denominados bits de guarda e
arredondamento.
Exemplo: 2,56 × 100 + 2,34 × 102
Com bits extras: 2,3400 + 0,0256 = 2,3656 × 102
Arredondamento: 2,37 × 102
Sem bits extras: 2,34 + 0,02 = 2,36 × 102
39
Observações Alguns erros comuns:
Deslocamento para a direita sempre implementa a divisão por uma potência de 2.
Isso é verdade desde que seja um número sem sinal.
Ou, então, caso o deslocamento preserve o bit de sinal.
Adição em ponto flutuante é associativa!
Por causa da precisão limitada, é possível que arredondamentos intermediários levem a resultados diferentes dependendo da ordem em que as somas são feitas.
Exemplo: a = -1,5 × 1038 b = 1,5 × 1038 c = 1
(a + b) + c = 1
a + (b + c) = 0
40
Caracteres Vários dados de entrada e saída dos computadores não são números,
vide o teclado, mouse, impressora etc.
É muito comum nos depararmos com caracteres:
Letras: A, B, …, Z
Dígitos: 0, 1, …, 9
Caracteres especiais: ?, @, #
Caracteres não-imprimíveis: ENTER, espaço
A representação numérica que vimos até agora faz sentido para o hardware e para o programador de linguagem de baixo nível. Porém, o usuário final lida diretamente com caracteres.
Como o computador associa estas duas representações?
41
Byte Caracteres visíveis
CÓDIGOS ALFANUMÉRICOS
Caracteres Existem diversos padrões de códigos alfanuméricos, sendo o de maior
destaque o chamado código ASCII (American Standard Code for Information Interchange).
ASCII: associa uma sequência de 8 bits (byte) a um caractere.
Por exemplo, ao digitar OBA no teclado, o processador recebe a seguinte
sequência de bits:
42 OBA 1001111 1000010 1000001
Números + Programa Armazenado Importante: uma sequência de bits armazenada na memória não
possui um significado intrínseco; isto é, ela pode ser interpretada de maneiras diferentes: Número sem sinal;
Número inteiro;
Número em representação de ponto flutuante;
Caractere (ASCII);
Instrução de máquina.
A ação que o processador está executando no momento é que determina como aquela cadeia binária deve ser interpretada.
Lembrar: há uma diferença fundamental entre os números
representados em computador e os números do mundo real.
Magnitude limitada.
Precisão limitada.
43
Podemos representar apenas 2N números, onde N é o número de bits para armazenamento/representação.
Créditos
44
Este material está baseado nas notas de aula elaboradas pelo Prof. Léo Pini e pelo aluno de doutorado Tiago Novaes.