780 likes | 1.59k Views
Aritmética Computacional. The complexity is in eye of the observer... As much as the object allows. Introdução. Humanos: sistema decimal. Computadores: sistema binário. Como representar números negativos e números reais? Qual é o maior número representável numa palavra de computador?
E N D
Aritmética Computacional The complexity is in eye of the observer... As much as the object allows.
Introdução • Humanos: sistema decimal. • Computadores: sistema binário. • Como representar números negativos e números reais? • Qual é o maior número representável numa palavra de computador? • O que acontece quando o resultado é maior do que a capacidade do computador?
Conteúdo • Números com sinal e números sem sinal • Adição e subtração • Operações lógicas • Construção de uma unidade aritmética lógica • Multiplicação • Divisão • Operações em ponto flutuante • Lendas e falhas • Considerações Finais
0 0 0 0 1 0 1 1 Bit Mais Significativo (MSB) Bit Menos Significativo (LSB) Números com Sinal e Números sem Sinal • Base 10: • 2543(10)=2103+5102+4101+3100(10) • Base 2: • 1011(2)=123+022+121+120=11(10) • Representação no Z80 (8 bits)
Faixa de números sem sinal para 8 bits: 0 a 256-1 • 0000 0000(2) = 0(10) • 0000 0001(2) = 1(10) • 0000 0010(2) = 2(10) • ... • 1111 1100(2) = 252(10) • 1111 1101(2) = 253(10) • 1111 1110(2) = 254(10) • 1111 1111(2) = 255(10)
Representação de números • Números reais: infinitos. • No computador: finitos. • Maioria: grande quantidade de zeros à esquerda. • Computador: pode lidar com números até um certo tamanho. • Overflow: tratado pelo sistema operacional. • No computador: é preciso representar números com sinal. • Solução: usar 1 bit (sinal magnitude). • Primeira tentativa: o bit mais significativos (MSB) é usado para sinal. • Problema: duas representações para o zero • Solução mais usada: complemento a 2
Complemento a 2 • A regra baseia-se no fato de que a soma de um número com sua representação invertida deve ser -1:
000 001 111 110 010 011 101 100 Faixa de valores em complemento a 2 para 3 bits 0 1 -1 -2 2 3 -3 -4
X = 1111 0111 + 1 Complemento a 2: regra prática • Considere X = 0000 1000, o complemento a 2 de X será: -X = 1111 1000
Interface Hardware/Software • Endereços: sempre positivos • Os números vão de 0 a 27FF (Z80), e não são nunca negativos. • Em C: “int” e “unsigned int”.
Exercícios • Converta -15(10) para binário com representação em sinal/magnitude (16 bits). • Converta -15(10) para binário com representação em complemento a 2 (16 bits). • Qual é o número, em decimal, representado em complemento a 2 por 1010 0011(2)? • Usando complemento a 2 qual é a faixa de números que podem ser representados com 8 bits?
Adição e Subtração • No computador: soma semelhante à soma no sistema decimal. • Soma: soma cada bit, mais o vai-um.
Subtração com complemento a 2 0000 0111 0000 0110 0000 0111 0000 0110 0000 0111 1111 1010 - + adição subtração + 0000 1101 0000 0001 0000 0001 Adição e Subtração (8 bits) • 6(10) = 0000 0110(2) • 7(10) = 0000 0111(2)
Overflow • Ocorre sempre que o resultado de uma operação não pode ser representado no hardware disponível. • Se um número for negativo, e o outro positivo, não ocorrerá overflow.
positivo positivo negativo overflow Exemplo de overflowAdição de 2 operandos positivos (8 bits) • Isto significa que o resultado está correto se o bit de sinal for ignorado 0100 0110 0110 0000 + 1010 0110
negativo negativo positivo carry overflow Exemplo de overflowAdição de 2 operandos negativos (8 bits) • Isto significa que o resultado é negativo e está em complemento a 2 1000 0000 1010 0000 + 1 0010 0000
positivo negativo negativo Exemplo de overflowAdição de operandos com sinais opostos (8 bits) • Não ocorre overflow, o resultado é negativo e está em complemento a 2 0100 0000 1010 0000 + 1110 0000
positivo negativo carry positivo Exemplo de overflowAdição de operandos com sinais opostos (8 bits) • Não ocorre overflow, o carry é ignorado e o resultado é positivo 0110 0000 1100 0000 + 1 0010 0000
Interface Hardware/Software • Na ocorrência de overflow: a máquina precisa decidir como tratá-lo. • Linguagem C: não toma conhecimento do overflows. A tarefa é do programador. • FORTRAN: trata o overflow
Exercícios • Faça as operações aritméticas abaixo utilizando números binários de 8 bits e complemento a 2: • +9 + 4 • +9 - 4 • -9 + 4 • -9 - 4
Operações Lógicas • Em muitas aplicações é necessário processar bits isolados dentro de uma palavra operações lógicas • Shifts: deslocamento à esquerda ou à direita instruções rlc, rrc, rl, rr • Ver apostila de laboratório: Aula 06 – Instruções de Rotação e Funções
Operações AND e OR • Operação AND: atua bit a bit, deixando 1 como resultado somente no caso de ambos os bits correspondentes dos operandos serem 1 (aplicação de máscara) • Operação OR: também atua bit a bit colocando 1 no resultado se qualquer um dos bits correspondentes do operando for 1.
Introdução • Representa os músculos do computador: realiza operações aritméticas como a adição e a subtração ou operações lógicas como AND e OR • A partir de agora mostrar-se-á como construir uma UAL para realizar as quatro operações acima
c a c a b c a b d 0 a c b 1 Blocos Construtivos Básicos NOT (Inversora) AND OR MultiplexadorSe d==0, c=a senão c=b
Uma UAL de 1 Bit • Unidade lógica de 1 bit: • Operação = 0 ou 1 AND ou OR.
Somador de 1 bit • Soma A + B + “vem 1” • Gera Resultado e “vai um” • Tabela Verdade:
+ Exercício • Gerar a unidade lógica a seguir: CarryIn a Soma b CarryOut
Exercícios • Alterar a UAL anterior para que ela gere o valor 0. Dica: a maneira mais fácil é expandir o multiplexador controlado pela linha Operação. • Como projetar uma UAL de 32 bits utilizando uma UAL de 1 bit?
Subtração • A subtração é obtida somando-se o minuendo ao complemento a 2 do subtraendo, ou seja, • O circuito ao lado inverte o valor de b. Falta ainda somar 1 ao valor de b invertido. • Como fazê-lo?
Subtração • Na soma o primeiro CarryIn (vem 1) é 0. • O que acontece de fizermos o primeiro CarryIn = 1?
Overflow • Como fazer a detecção de overflow? • Leia o tópico “Adaptação da UAL de 32 bits para o MIPS” e faça o exercício 4.23 do livro texto.
Problema • Qual é o problema de uma UAL projetada como a anterior?
Carry Lookahead • Com que velocidade podemos somar dois operandos de 32 bits? • Observe que as entradas a e b podem ser perfeitamente determinadas a qualquer tempo, mas a entrada CarryIn de um determinado somador de 1 bit depende do resultado da operação realizada no somador de 1 bit vizinho. • Solução: • CarryIn1=B0CarryIn0+a0CarryIn0+a0b0 ou • C1=b0c0+a0.c0+a0b0 • C2=b1c1+a1c1+a0b0
Carry Lookahead • Problema deste método: circuito ainda complexo para cálculos de muitos bits e portanto caro. • Qual a solução? • Método de propagador e gerador. Veja livro texto.
Exemplo: como na prática multiplicando 1000 x 1001 1000 0000 0000 1000____ 1001000 multiplicador • Número de dígitos: multiplicando + multiplicador. • 32 bits x 32 bits = 64 bits. produto
Algoritmo • Como na prática • Simplesmente coloque um cópia do multiplicando (1 x multiplicando) no lugar apropriado, se o digito do multiplicando for igual a 1, ou • Coloque 0 (0 x multiplicando) no lugar apropriado, se o digito do multiplicando for igual a 0; • Veremos a seguir 3 versões do algoritmo de multiplicação para 32 bits (32 x 32 bits)
Algoritmo: 1ª Versão início 1. teste do Multiplicador0 Multiplicador0=1 Multiplicador0=0 1a. Produto = Produto + Multiplicando 2. desloque Multiplicando 1 bit à esquerda 3. desloque Multiplicador 1 bit à direita não 32 repetições? sim Fim
Exercício • Usando números de 4 bits, com o intuito de economizar espaço, multiplique 210 por 310 ou 00102 por 00112. • Valores iniciais: • Multiplicando = 0000 0010 • Multiplicador = 0011 • Produto = 0000 0000
Desvantagens • UAL de 64 bits. • 2 registradores de 64 bits • Próxima versão: • Metade dos bits do multiplicando da primeira versão são sempre zero, de modo que somente metade deles poderia conter informações úteis. A segunda versão utiliza-se desta informação para melhorar a performance da multiplicação.
Algoritmo: 2ª Versão início 1. teste do Multiplicador0 Multiplicador0=1 Multiplicador0=0 1a. Some o multiplicando à metade esquerda do produto 2. desloque o registrador de Produto 1 bit à direita 3. desloque o registrador Multiplicador 1 bit à direita sim não 32 repetições? Fim