Aritmetica Computacional

10.319 visualizações

Publicada em

0 comentários
5 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
10.319
No SlideShare
0
A partir de incorporações
0
Número de incorporações
35
Ações
Compartilhamentos
0
Downloads
347
Comentários
0
Gostaram
5
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Aritmetica Computacional

  1. 1. Aritmética Computacional The complexity is in eye of the observer... As much as the object allows.
  2. 2. Introdução <ul><li>Humanos: sistema decimal. </li></ul><ul><li>Computadores: sistema binário. </li></ul><ul><li>Como representar números negativos e números reais? </li></ul><ul><li>Qual é o maior número representável numa palavra de computador? </li></ul><ul><li>O que acontece quando o resultado é maior do que a capacidade do computador? </li></ul>
  3. 3. Conteúdo <ul><li>Números com sinal e números sem sinal </li></ul><ul><li>Adição e subtração </li></ul><ul><li>Operações lógicas </li></ul><ul><li>Construção de uma unidade aritmética lógica </li></ul><ul><li>Multiplicação </li></ul><ul><li>Divisão </li></ul><ul><li>Operações em ponto flutuante </li></ul><ul><li>Lendas e falhas </li></ul><ul><li>Considerações Finais </li></ul>
  4. 4. Números com sinal e números sem sinal 1
  5. 5. Números com Sinal e Números sem Sinal <ul><li>Base 10: </li></ul><ul><ul><li>2543 (10) =2  10 3 +5  10 2 +4  10 1 +3  10 0 (10) </li></ul></ul><ul><li>Base 2: </li></ul><ul><ul><li>1011 (2) =1  2 3 +0  2 2 +1  2 1 +1  2 0 =11 (10) </li></ul></ul><ul><li>Representação no Z80 (8 bits) </li></ul>0 0 0 0 1 0 1 1 Bit Menos Significativo (LSB) Bit Mais Significativo (MSB)
  6. 6. Faixa de números sem sinal para 8 bits: 0 a 256-1 <ul><li>0000 0000 (2) = 0 (10) </li></ul><ul><li>0000 0001 (2) = 1 (10) </li></ul><ul><li>0000 0010 (2) = 2 (10) </li></ul><ul><li>... </li></ul><ul><li>1111 1100 (2) = 252 (10) </li></ul><ul><li>1111 1101 (2) = 253 (10) </li></ul><ul><li>1111 1110 (2) = 254 (10) </li></ul><ul><li>1111 1111 (2) = 255 (10) </li></ul>
  7. 7. Representação de números <ul><li>Números reais: infinitos. </li></ul><ul><li>No computador: finitos. </li></ul><ul><li>Maioria: grande quantidade de zeros à esquerda. </li></ul><ul><li>Computador: pode lidar com números até um certo tamanho. </li></ul><ul><li>Overflow : tratado pelo sistema operacional. </li></ul><ul><li>No computador: é preciso representar números com sinal. </li></ul><ul><ul><li>Solução: usar 1 bit (sinal magnitude). </li></ul></ul><ul><li>Primeira tentativa: o bit mais significativos (MSB) é usado para sinal. </li></ul><ul><ul><li>Problema: duas representações para o zero </li></ul></ul><ul><ul><li>Solução mais usada: complemento a 2 </li></ul></ul>
  8. 8. Complemento a 2 <ul><li>A regra baseia-se no fato de que a soma de um número com sua representação invertida deve ser -1: </li></ul>
  9. 9. Faixa de valores em complemento a 2 para 3 bits 0 -4 2 -2 1 3 -3 -1 111 101 011 001 010 110 100 000
  10. 10. Complemento a 2: regra prática <ul><li>Considere X = 0000 1000, o complemento a 2 de X será: </li></ul>-X = 1111 1000 X = 1111 0111 1 +
  11. 11. Interface Hardware/Software <ul><li>Endereços: sempre positivos </li></ul><ul><li>Os números vão de 0 a 27FF (Z80), e não são nunca negativos. </li></ul><ul><li>Em C: “int” e “unsigned int”. </li></ul>
  12. 12. Exercícios <ul><li>Converta -15 (10) para binário com representação em sinal/magnitude (16 bits). </li></ul><ul><li>Converta -15 (10) para binário com representação em complemento a 2 (16 bits). </li></ul><ul><li>Qual é o número, em decimal, representado em complemento a 2 por 1010 0011 (2) ? </li></ul><ul><li>Usando complemento a 2 qual é a faixa de números que podem ser representados com 8 bits? </li></ul>
  13. 13. Adição e Subtração 2
  14. 14. Adição e Subtração <ul><li>No computador: soma semelhante à soma no sistema decimal. </li></ul><ul><li>Soma: soma cada bit, mais o vai-um. </li></ul>
  15. 15. Adição e Subtração (8 bits) <ul><li>6 (10) = 0000 0110 (2) </li></ul><ul><li>7 (10) = 0000 0111 (2) </li></ul>0000 0111 0000 0110 + 0000 1101 adição 0000 0111 0000 0110 - 0000 0001 subtração 0000 0111 1111 1010 + 0000 0001 Subtração com complemento a 2
  16. 16. Overflow <ul><li>Ocorre sempre que o resultado de uma operação não pode ser representado no hardware disponível. </li></ul><ul><li>Se um número for negativo, e o outro positivo, não ocorrerá overflow. </li></ul><0 <0 >=0 A-B >=0 >=0 <0 A-B >=0 <0 <0 A+B <0 >=0 >= 0 A+B Resultado Operando B Operando A Operação
  17. 17. Exemplo de overflow Adição de 2 operandos positivos (8 bits) <ul><li>Isto significa que o resultado está correto se o bit de sinal for ignorado </li></ul>0100 0110 0110 0000 + 1010 0110 overflow positivo positivo negativo
  18. 18. Exemplo de overflow Adição de 2 operandos negativos (8 bits) <ul><li>Isto significa que o resultado é negativo e está em complemento a 2 </li></ul>1000 0000 1010 0000 + 1 0010 0000 overflow negativo negativo positivo carry
  19. 19. Exemplo de overflow Adição de operandos com sinais opostos (8 bits) <ul><li>Não ocorre overflow, o resultado é negativo e está em complemento a 2 </li></ul>0100 0000 1010 0000 + 1110 0000 positivo negativo negativo
  20. 20. Exemplo de overflow Adição de operandos com sinais opostos (8 bits) <ul><li>Não ocorre overflow, o carry é ignorado e o resultado é positivo </li></ul>0110 0000 1100 0000 + 1 0010 0000 positivo negativo positivo carry
  21. 21. Interface Hardware/Software <ul><li>Na ocorrência de overflow: a máquina precisa decidir como tratá-lo. </li></ul><ul><ul><li>Linguagem C: não toma conhecimento do overflows. A tarefa é do programador. </li></ul></ul><ul><ul><li>FORTRAN: trata o overflow </li></ul></ul>
  22. 22. Exercícios <ul><li>Faça as operações aritméticas abaixo utilizando números binários de 8 bits e complemento a 2: </li></ul><ul><ul><li>+9 + 4 </li></ul></ul><ul><ul><li>+9 - 4 </li></ul></ul><ul><ul><li>-9 + 4 </li></ul></ul><ul><ul><li>-9 - 4 </li></ul></ul>
  23. 23. Operações Lógicas 3
  24. 24. Operações Lógicas <ul><li>Em muitas aplicações é necessário processar bits isolados dentro de uma palavra  operações lógicas </li></ul><ul><li>Shifts: deslocamento à esquerda ou à direita  instruções rlc, rrc, rl, rr </li></ul><ul><ul><li>Ver apostila de laboratório: Aula 06 – Instruções de Rotação e Funções </li></ul></ul>
  25. 25. Operações AND e OR <ul><li>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) </li></ul><ul><li>Operação OR: também atua bit a bit colocando 1 no resultado se qualquer um dos bits correspondentes do operando for 1. </li></ul>
  26. 26. Construção de uma Unidade Aritmética Lógica 4
  27. 27. Introdução <ul><li>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 </li></ul><ul><li>A partir de agora mostrar-se-á como construir uma UAL para realizar as quatro operações acima </li></ul>
  28. 28. Blocos Construtivos Básicos NOT (Inversora) AND OR Multiplexador Se d==0, c=a senão c=b a c a c b a c b a b 0 1 d c
  29. 29. Uma UAL de 1 Bit <ul><li>Unidade lógica de 1 bit: </li></ul><ul><li>Operação = 0 ou 1  AND ou OR. </li></ul>
  30. 30. Somador de 1 bit <ul><li>Soma A + B + “vem 1” </li></ul><ul><li>Gera Resultado e “vai um” </li></ul><ul><li>Tabela Verdade: </li></ul>1+1+1 = 11 1+1+0 = 10 1+0+1 = 10 1+0+0 = 01 0+1+1 = 10 0+1+0 = 01 0+0+1 = 01 0+0+0 = 00 Comentários 1 0 1 1 0 0 1 0 0 1 1 0 1 0 1 1 0 0 1 1 1 0 1 0 Vem 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 Vai 1 Soma B A Saídas Entradas
  31. 31. Exercício <ul><li>Gerar a unidade lógica a seguir: </li></ul>Soma CarryOut CarryIn a b +
  32. 32. UAL Simples de 1 bit
  33. 33. Exercícios <ul><li>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. </li></ul><ul><li>Como projetar uma UAL de 32 bits utilizando uma UAL de 1 bit? </li></ul>
  34. 34. UAL de 32 bits
  35. 35. Subtração <ul><li>A subtração é obtida somando-se o minuendo ao complemento a 2 do subtraendo, ou seja, </li></ul><ul><li>O circuito ao lado inverte o valor de b. Falta ainda somar 1 ao valor de b invertido. </li></ul><ul><li>Como fazê-lo? </li></ul>
  36. 36. Subtração <ul><li>Na soma o primeiro CarryIn (vem 1) é 0. </li></ul><ul><li>O que acontece de fizermos o primeiro CarryIn = 1? </li></ul>
  37. 37. Overflow <ul><li>Como fazer a detecção de overflow? </li></ul><ul><ul><li>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. </li></ul></ul>
  38. 38. Símbolo Geral da UAL
  39. 39. Problema <ul><li>Qual é o problema de uma UAL projetada como a anterior? </li></ul>
  40. 40. Carry Lookahead <ul><li>Com que velocidade podemos somar dois operandos de 32 bits? </li></ul><ul><ul><li>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. </li></ul></ul><ul><ul><li>Solução: </li></ul></ul><ul><ul><ul><li>CarryIn1=B0  CarryIn0+a0  CarryIn0+a0  b0 ou </li></ul></ul></ul><ul><ul><ul><li>C1=b0  c0+a0.c0+a0  b0 </li></ul></ul></ul><ul><ul><ul><li>C2=b1  c1+a1  c1+a0  b0 </li></ul></ul></ul>
  41. 41. Carry Lookahead <ul><li>Problema deste método: circuito ainda complexo para cálculos de muitos bits e portanto caro. </li></ul><ul><li>Qual a solução? </li></ul><ul><ul><li>Método de propagador e gerador. Veja livro texto. </li></ul></ul>
  42. 42. Multiplicação 5
  43. 43. Exemplo: como na prática <ul><li>1000 </li></ul><ul><li>x 1001 </li></ul><ul><li>1000 </li></ul><ul><li>0000 </li></ul><ul><li>0000 </li></ul><ul><li>1000____ </li></ul><ul><li>1001000 </li></ul>multiplicando multiplicador produto <ul><li>Número de dígitos: multiplicando + multiplicador. </li></ul><ul><li>32 bits x 32 bits = 64 bits. </li></ul>
  44. 44. Algoritmo <ul><li>Como na prática </li></ul><ul><li>Simplesmente coloque um cópia do multiplicando (1 x multiplicando) no lugar apropriado, se o digito do multiplicando for igual a 1, ou </li></ul><ul><li>Coloque 0 (0 x multiplicando) no lugar apropriado, se o digito do multiplicando for igual a 0; </li></ul><ul><li>Veremos a seguir 3 versões do algoritmo de multiplicação para 32 bits (32 x 32 bits) </li></ul>
  45. 45. Algoritmo: 1 ª Versão início 1. teste do Multiplicador0 1a. Produto = Produto + Multiplicando 2. desloque Multiplicando 1 bit à esquerda 3. desloque Multiplicador 1 bit à direita 32 repetições? Fim Multiplicador0=0 Multiplicador0=1 não sim
  46. 46. Hardware: 1 ª Versão
  47. 47. Exercício <ul><li>Usando números de 4 bits, com o intuito de economizar espaço, multiplique 2 10 por 3 10 ou 0010 2 por 0011 2 . </li></ul><ul><li>Valores iniciais: </li></ul><ul><ul><li>Multiplicando = 0000 0010 </li></ul></ul><ul><ul><li>Multiplicador = 0011 </li></ul></ul><ul><ul><li>Produto = 0000 0000 </li></ul></ul>
  48. 48. Desvantagens <ul><li>UAL de 64 bits. </li></ul><ul><li>2 registradores de 64 bits </li></ul><ul><li>Próxima versão: </li></ul><ul><ul><li>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. </li></ul></ul>
  49. 49. Algoritmo: 2 ª Versão início 1. teste do Multiplicador0 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 32 repetições? Fim Multiplicador0=0 Multiplicador0=1 não sim
  50. 50. Hardware: 2 ª Versão
  51. 51. Exercício <ul><li>Multiplique 0010 2 por 0011 2 usando a segunda versão do algoritmo de multiplicação. </li></ul><ul><li>Valores iniciais: </li></ul><ul><ul><li>Multiplicando = 0010 </li></ul></ul><ul><ul><li>Multiplicador = 0011 </li></ul></ul><ul><ul><li>Produto = 0000 0000 </li></ul></ul>
  52. 52. Versão Final do Algoritmo de Multiplicação <ul><li>O registrador reservado ao produto desperdiça tanto espaço quanto o do multiplicador: à medida que o desperdício de espaço do produto se reduzia, a mesma coisa acontecia com o multiplicador. </li></ul>
  53. 53. Algoritmo: 3 ª Versão início 1. teste do Produto0 1a. Some o multiplicando à metade esquerda do produto 2. desloque o registrador de Produto 1 bit à direita 32 repetições? Fim Produto0=0 Produto0=1 não sim
  54. 54. Hardware: 3 ª Versão Vantagens : ULA de 32 bits. Apenas 1 registrador de 64 bits.
  55. 55. Exercício <ul><li>Multiplique 0010 2 por 0011 2 usando a terceira versão do algoritmo de multiplicação. </li></ul><ul><li>Valores iniciais: </li></ul><ul><ul><li>Multiplicando = 0010 </li></ul></ul><ul><ul><li>Produto = 0000 0011 </li></ul></ul>
  56. 56. Divisão Divide et impera. Versão latina da velha máxima política “Divida e governe”, citada por Maquiavel em 1532 6
  57. 57. Divisão <ul><li>A operação recíproca da multiplicação é a divisão, operação que é ainda menos freqüente que a multiplicação e mais ardilosa. Além disso, ela oferece uma rara oportunidade de se efetuar uma operação matemática inválida: a divisão por zero. </li></ul><ul><li>dividendo = quociente x divisor + resto </li></ul>
  58. 58. Divisão início Teste do Resto 2a. Desloque o Quociente 1 bit à esquerda Q0 = 1 3. Desloque o Divisor 1 bit à direita 33 repetições? Fim Resto < 0 Resto>=0 não sim 1. Resto = Resto - Divisor 2b. Resto = Resto + Divisor Desloque o Quociente um 1 bit à esquerda Q0 = 0
  59. 59. Hardware da Divisão Divisor Deslocamento à direita (64 bits) UAL de 64 bits Quociente Deslocamento À esquerda (32 bits) Teste de controle 64 bits Resto Escrita
  60. 60. Exercício <ul><li>Dividir 0000 0111 2 por 0010 2 . </li></ul><ul><li>Valores iniciais: </li></ul><ul><ul><li>Quociente = 0000 </li></ul></ul><ul><ul><li>Divisor = 0010 0000 </li></ul></ul><ul><ul><li>Resto = 0000 0111 </li></ul></ul>
  61. 61. Operações em Ponto Flutuante 7
  62. 62. Operações em Ponto Flutuante <ul><li>Suporte a números inteiros com e sem sinal. </li></ul><ul><li>Suporte a números fracionários: 3,1414, 0,00001 etc. </li></ul><ul><li>Notação científica: 1,34 x 10 3 . </li></ul><ul><li>Números normalizados: 1 dígito antes do ponto decimal. </li></ul><ul><li>Números binários também podem ser normalizados. </li></ul><ul><li>Ponto decimal / ponto binário. </li></ul><ul><li>Aritmética com números normalizados: aritmética de ponto flutuante. </li></ul><ul><li>Em C: “float”. </li></ul><ul><li>Formato: 1,xxxxxxxx 2  2 yyyy . </li></ul>
  63. 63. Representação em Ponto Flutuante <ul><li>S – sinal do número </li></ul><ul><li>F – mantissa, normalizada </li></ul><ul><li>E – expoente </li></ul><ul><li>Tamanho: -2,0  10 38 a 2,0  10 38 . </li></ul>s expoente mantissa 32 bits 1 8 23
  64. 64. Overflow em Ponto Flutuante <ul><li>Ocorre quando o expoente é muito grande pra ser representado pelos 8 bits. </li></ul><ul><li>Underflow : O módulo do expoente negativo é muito grande. </li></ul><ul><li>Necessário números maiores: precisão dupla. Na linguagem C: double. </li></ul><ul><li>Representa números entre -2,0  10 -308 a 2,0  10 308 . </li></ul>s expoente mantissa 64 bits 1 11 52
  65. 65. Padrão IEEE 754 <ul><li>Torna implícito o “1” à esquerda do ponto binário. </li></ul><ul><li>Quando o expoente for zero, o hardware não considera o primeiro bit “1” implícito, para permitir a representação do número “0” em ponto flutuante. </li></ul>
  66. 66. Padrão IEEE 754 <ul><li>Deve permitir comparações rápidas. </li></ul><ul><li>Seria melhor: o menor coeficiente possível valer 00000000, e o maior 11111111. </li></ul><ul><li>Modificação: </li></ul><ul><ul><li>Subtrair 127 (peso) do exponente. </li></ul></ul><ul><ul><li>Representação de –1: -1+127=-1+01111111=01111110. </li></ul></ul><ul><ul><li>+1=+1+127=10000000 2 . </li></ul></ul><ul><li>Formato: </li></ul><ul><li>Peso para precisão dupla: 1.023. </li></ul>
  67. 67. Exemplo 1 <ul><li>Representar o número -0,75 10 em ponto flutuante e precisão simples. </li></ul><ul><li>Representar o número -0,75 10 em ponto flutuante e dupla precisão. </li></ul>
  68. 68. Resposta da 1 <ul><li>1 a fase: converter para binário: </li></ul><ul><ul><li>0,75 x 2 = 1,5  1 </li></ul></ul><ul><ul><li>0,5 x 2 = 1,0  1 </li></ul></ul><ul><ul><li>-0,75 10 = -0,11 2 = -0,11 x 2 0 = -1,1 x 2 -1 </li></ul></ul><ul><li>Em precisão simples: </li></ul><ul><li>Resultado: </li></ul><ul><li>Representação: </li></ul>
  69. 69. Exemplo <ul><li>Converter a palavra abaixo em ponto flutuante para número </li></ul>
  70. 70. Resposta
  71. 71. Lendas e Falhas 8
  72. 72. Lendas e Falhas <ul><li>Lenda: a adição em ponto flutuante é associativa; ou seja, x+(y+z)=(x+y)+z . </li></ul><ul><li>Lenda: assim como uma instrução de deslocamento à esquerda pode substituir uma multiplicação inteira por uma divisão inteira por uma potência de 2. </li></ul><ul><li>Lenda: só os matemáticos teóricos se preocupam com a precisão das operações em ponto flutuante. </li></ul>
  73. 73. Bibliografia <ul><li>Patterson, David A. e Hennessy, John L. Organização e Projeto de Computadores: A Interface Hardware/Software . Ed. LTC, 2. Ed., 2000, Rio de Janeiro. </li></ul>

×