Aritmética computacional

Aprenda como o hardware do processador realiza operações aritméticas. Some e subtraia com um único somador em complemento de dois, diferencie vai-um de estouro e construa uma ULA que também compara números e executa operações lógicas. Acompanhe o funcionamento de multiplicadores e divisores, desde circuitos de deslocamento e soma até o algoritmo de Booth e multiplicadores rápidos em árvore, incluindo as instruções RISC-V. Em seguida, codifique números em ponto flutuante IEEE 754, some, multiplique e arredonde-os como o hardware faz e explique por que resultados como 0,1 + 0,2 não são exatos.

IntermediárioAula 3 de 6 do curso Curso de Organização e arquitetura de computadores

O que você vai aprender

  1. Use um único somador binário para adição e subtração com e sem sinal e determine quando um resultado deixa de caber nos bits disponíveis.
    • Somar e subtrair inteiros binários com um único somador
      Some números de n bits coluna por coluna, subtraia somando o complemento de dois e veja por que o mesmo circuito serve para valores com e sem sinal.
    • Detectar estouro em resultados com e sem sinal
      Diferencie vai-um de estouro, detecte cada um com hardware simples ou uma sequência curta de instruções e saiba o que processadores e linguagens fazem quando isso acontece.
  2. Construa uma ULA com fatias de 1 bit que soma, subtrai, compara e executa operações lógicas e acelere sua cadeia de vai-um.
    • Construir uma ULA de n bits a partir de fatias de 1 bit
      Combine portas lógicas, um somador completo e multiplexadores em uma ULA de 1 bit, encadeie as fatias em uma ULA de n bits e selecione operações com linhas de controle.
    • Comparar números e detectar zero na ULA
      Produza a saída Zero para desvios por igualdade e o resultado de menor que para comparações com e sem sinal, incluindo a correção por estouro.
    • Acelerar a adição com antecipação de vai-um
      Explique por que os sinais de vai-um tornam lentos os somadores com propagação e calcule-os antecipadamente com sinais de geração e propagação.
  3. Multiplique e divida como o hardware faz, desde circuitos simples de deslocamento e soma até regras de sinal, multiplicadores rápidos e instruções RISC-V.
    • Multiplicar com deslocamentos e somas
      Multiplique números binários sem sinal com o algoritmo sequencial de deslocamentos e somas, dimensione o produto corretamente e use deslocamentos para potências de dois.
    • Multiplicar números com sinal e realizar multiplicações rápidas
      Trabalhe com operandos em complemento de dois, recodifique multiplicadores com o algoritmo de Booth e explique como multiplicadores em árvore alcançam alta velocidade.
    • Dividir inteiros e tratar os casos especiais
      Divida com o algoritmo de restauração, aplique as regras de sinal para quociente e resto e saiba como o hardware e o RISC-V tratam a divisão por zero e o estouro.
  4. Codifique e decodifique valores binários IEEE 754, explique o intervalo e a precisão de cada formato e reconheça zeros, infinitos, NaNs e números subnormais.
    • Codificar e decodificar formatos binários IEEE 754
      Escreva um número em notação científica binária normalizada, armazene-o nos campos de sinal, expoente com viés e fração e interprete os bits armazenados como um valor.
    • Usar zeros, infinitos, NaNs e números subnormais
      Reconheça os padrões de expoente reservados, explique o subfluxo gradual e preveja os resultados e indicadores de operações excepcionais.
  5. Acompanhe as etapas de hardware da adição e multiplicação em ponto flutuante, arredonde os resultados corretamente e preveja os erros de precisão resultantes.
    • Somar e multiplicar números de ponto flutuante
      Alinhe, opere, normalize e arredonde na ordem usada pelo hardware de ponto flutuante e use as instruções de ponto flutuante do RISC-V.
    • Arredondar resultados corretamente
      Aplique as direções de arredondamento do IEEE 754, arredonde para o mais próximo com desempate para o par e use bits de guarda, de arredondamento e de aderência para arredondar como se houvesse precisão infinita.
    • Prever e evitar erros de precisão
      Explique por que valores decimais familiares são inexatos em binário, por que a adição em ponto flutuante não é associativa e como absorção, cancelamento e conversões causam falhas reais.

Guia de estudo de Aritmética computacional

5 capítulos

1

Somar e subtrair inteiros e detectar estouro

Um somador produz bits antes que se decida se eles representam números com ou sem sinal. Acompanhe os sinais de vai-um durante a adição, reutilize o mesmo circuito para subtração e depois verifique o resultado em relação ao intervalo correto. A distinção também importa no software: um processador pode manter indicadores de estado, retornar os bits menos significativos ou gerar uma exceção, enquanto uma linguagem de programação atribui suas próprias regras a essas operações de máquina.

1.1 Somar e subtrair inteiros binários com um único somador

Um somador binário realiza a mesma pequena tarefa em cada posição de bit. Ele combina os dois bits dos operandos com um vai-um da posição à direita. O significado do padrão de bits completo vem depois.

Acompanhe o vai-um

Um meio somador tem duas entradas: sua soma é o XOR delas e seu vai-um é o AND delas. Um somador completo também aceita um vai-um de entrada:

si=ai⊕bi⊕ci ci+1=aibi+aici+bici

Aqui a multiplicação significa AND e a adição significa OR. A soma é 1 para um número ímpar de entradas iguais a 1; o vai-um é 1 para pelo menos duas. Encadear somadores completos forma um somador com propagação de vai-um. Apenas o bit 0 recebe o vai-um inicial; cada bit posterior recebe o vai-um produzido pelo vizinho.

Para 23 + 45, escreva 0001 0111 + 0010 1101. No bit 0, 1 + 1 produz soma 0 e vai-um 1. No bit 1, 1 + 0 + 1 novamente produz 0 e vai-um 1. No bit 2, três entradas iguais a 1 produzem soma 1 e vai-um 1. Continuando para a esquerda, obtemos 0100 0100, ou 68, sem vai-um final.

Um resultado de n bits mantém apenas os n bits menos significativos, portanto o circuito calcula a soma módulo 2n. Em 8 bits, 1111 1100 + 0000 0101 produz 0000 0001 e vai-um de saída 1. Interpretado com sinal, isso é −4 + 5 = 1. Interpretado sem sinal, é 252 + 5 = 257, cujos oito bits menos significativos representam 1. O circuito não mudou; o intervalo permitido mudou.

Transforme subtração em adição

O complemento de dois fornece a identidade

a−b=a+b‾+1.

Uma linha de controle de subtração aplica XOR a cada bit do segundo operando com 1, invertendo-o, e define o vai-um de entrada inicial como 1. Para adição, essa linha é 0, portanto o segundo operando passa inalterado e o vai-um inicial é 0.

Para calcular 23 − 45, inverta 0010 1101 para 1101 0010. Some 0001 0111 + 1101 0010 + 1 para obter 1110 1010, com vai-um de saída 0. Seu valor com sinal é −22. Deixar o vai-um inicial em 0 produziria −23: a inversão sozinha fornece um a menos que o valor negativo necessário.

Para subtração sem sinal, vai-um de saída 1 significa nenhum empréstimo; vai-um de saída 0 significa que foi necessário um empréstimo. Assim, o vai-um de saída 0 em 23 − 45 indica um resultado sem sinal abaixo de zero. O Arm registra esse vai-um que indica ausência de empréstimo; o x86 registra seu inverso como indicador de empréstimo.

Iguale as larguras antes de operar
InterpretaçãoRegra de extensãoExtensão de 1110 de 4 bits para 8 bits
Complemento de dois com sinalCopiar o bit de sinal1111 1110, ainda −2
Sem sinalInserir zeros0000 1110, ainda 14

No RISC-V, lb estende um byte com sinal, lbu o estende com zeros e addi estende seu imediato de 12 bits com sinal. Escolha a extensão conforme o significado do operando antes de enviar os bits ao somador.

O valor com sinal mais negativo não tem um correspondente positivo na mesma largura. Negar 1000 0000 de 8 bits o inverte para 0111 1111 e soma 1, retornando 1000 0000. O +128 desejado precisa de um formato com sinal mais largo.

Principais conclusões

  • Um somador completo combina dois bits de operandos e um vai-um de entrada.
  • A soma armazenada de n bits é a soma matemática módulo 2n.
  • A subtração inverte o segundo operando e define apenas o vai-um de entrada inicial como 1.
  • Nesse circuito de subtração, vai-um de saída 1 significa ausência de empréstimo sem sinal.
  • A extensão de sinal preserva valores com sinal; a extensão com zeros preserva valores sem sinal.

1.2 Detectar estouro em resultados com e sem sinal

Estouro significa que o resultado exato está fora do intervalo do destino. Valores sem sinal de n bits vão de 0 a 2n−1; valores com sinal em complemento de dois vão de −2n−1 a 2n−1−1. Oito bits comportam de 0 a 255 sem sinal ou de −128 a 127 com sinal. O mesmo resultado armazenado pode ser válido em uma interpretação e representar estouro na outra.

Teste o sinal correto
OperaçãoEstouro sem sinalEstouro com sinal
AdiçãoO vai-um de saída do bit mais significativo é 1Entradas com o mesmo sinal produzem resultado de sinal oposto
SubtraçãoÉ necessário um empréstimoEntradas com sinais diferentes produzem resultado com sinal diferente do da primeira entrada

Para adição ou subtração com sinal, o hardware pode usar

V=cn−1⊕cn,

em que os dois sinais de vai-um entram e saem da posição de sinal. O vai-um de saída sozinho responde à questão sem sinal.

Some 107 e 54 em 8 bits: 0110 1011 + 0011 0110 produz 1010 0001. Um vai-um entra no bit 7, mas nenhum sai, portanto o estouro é 1. O valor sem sinal 161 cabe; a interpretação com sinal −95 não é igual à soma real 161. Por outro lado, −4 + 5 produz vai-um 1, mas estouro com sinal 0. Somar 1000 0000 a si mesmo produz vai-um 1 e estouro 1, portanto ambas as interpretações falham.

Somar sinais opostos não pode causar estouro: a soma exata está entre os operandos. A subtração precisa de sua própria regra de sinal porque subtrair um número negativo aumenta o primeiro operando. Por exemplo, 100 − (−40) é grande demais para 8 bits com sinal, embora ambos os valores de entrada caibam.

Saiba o que a instrução faz

No x86, add define indicadores de vai-um e de estouro. No Arm, operações que atualizam indicadores, como ADDS, os definem; o ADD comum preserva os indicadores existentes. No MIPS, add e addi geram armadilha em caso de estouro com sinal, enquanto addu e addiu não geram. A adição de inteiros no RISC-V grava os bits menos significativos e não tem indicadores de estouro nem armadilha de estouro aritmético.

Após add t0, t1, t2, uma verificação sem sinal no RISC-V é:

bltu t0, t1, overflow

Uma soma sem sinal que deu a volta é menor que um operando original. Valores com sinal precisam de outra verificação:

slti t3, t2, 0
slt  t4, t0, t1
bne  t3, t4, overflow

A primeira instrução registra se o segundo operando é negativo. A segunda registra se o resultado é menor que o primeiro operando. Sem estouro, esses testes concordam: somar um negativo reduz o valor, enquanto somar um não negativo não pode reduzi-lo. Uma diferença detecta estouro. Para um imediato positivo conhecido, basta um desvio com sinal que teste se a soma diminuiu.

Separe o hardware das regras da linguagem

Em C e C++, a aritmética sem sinal dá a volta módulo 2n; o estouro com sinal é comportamento indefinido. Em Java, int e long dão a volta, enquanto Math.addExact informa o estouro com uma exceção. Os inteiros do Python crescem conforme necessário. Portanto, o fato de o hardware dar a volta não determina o que um programa em C pode fazer.

Adições e subtrações que dão a volta preservam um resultado final que cabe na representação: na aritmética modular de 8 bits, (100 + 50) − 60 dá a volta primeiro para −106 e depois para 90. Esse raciocínio se aplica à aritmética que dá a volta, não a expressões com sinal em C que estouram.

A saturação é uma política diferente. Em 8 bits sem sinal, 200 + 100 satura em 255 em vez de dar a volta para 44. Isso é útil para intensidades de pixels e outros sinais limitados, em que transformar um grande resultado positivo em um valor pequeno ao dar a volta seria enganoso.

Principais conclusões

  • Escolha os testes de estouro conforme a interpretação dos operandos e a operação.
  • O estouro com sinal é o XOR dos sinais de vai-um que entram e saem do bit de sinal.
  • O software RISC-V deve testar o estouro de inteiros quando precisa informá-lo.
  • O estouro com sinal em C, a volta em Java e os inteiros que crescem em Python têm semânticas diferentes.
  • A adição e a subtração modulares podem recuperar um valor final representável após uma volta intermediária.
  • A saturação limita um resultado fora do intervalo a uma de suas extremidades.
2

Projetar uma unidade lógica e aritmética

Uma ULA transforma uma escolha de operações em um circuito compartilhado. Portas e um somador calculam resultados candidatos, linhas de controle selecionam um deles e algumas saídas extras permitem testar igualdade e ordem. Construa essa estrutura com fatias de bits, veja por que a comparação com sinal precisa de correção por estouro e depois encurte o caminho do vai-um para que um caminho de dados mais largo possa produzir seu resultado aritmético sem esperar que um vai-um atravesse todos os bits.

2.1 Construir uma ULA de n bits a partir de fatias de 1 bit

Uma unidade lógica e aritmética, ou ULA, recebe operandos e entradas de controle e produz um resultado e saídas de estado. Ela é combinacional: suas saídas dependem das entradas atuais. Registradores guardam operandos e recebem resultados; a própria ULA não armazena nada.

Construa um bit e depois repita

Uma fatia de 1 bit calcula AND, OR e uma soma de somador completo em paralelo. Um multiplexador seleciona qual resultado candidato chega ao bit de resultado. Em uma ULA de n bits, todas as fatias compartilham os controles de operação, enquanto o vai-um de saída de cada somador alimenta o vai-um de entrada da fatia seguinte. Operações lógicas funcionam independentemente em cada posição; a adição depende da cadeia de vai-um.

Um controle Bnegate inverte o segundo operando e define o vai-um de entrada do bit 0. Selecionar o somador então calcula a subtração. As fatias mais significativas recebem seu vai-um da fatia anterior, não diretamente de Bnegate. Ativar todas as entradas de vai-um inseriria valores um extras no cálculo.

Um controle Ainvert também pode inverter o primeiro operando. Selecionar AND com ambos os operandos invertidos produz NOR pela lei de De Morgan:

a‾⋅b‾=a+b‾.

Selecionar OR com ambos invertidos produz NAND. Nessas equações lógicas, o sinal de mais denota OR.

Leia uma palavra de controle

Uma ULA clássica de livro didático usa os campos Ainvert, Bnegate e um seletor Operation de dois bits:

Palavra de controleResultado selecionado
0000AND
0001OR
0010Adição
0110Subtração
0111Atribuição se menor com sinal
1100NOR

Essas são as codificações desse projeto específico. São controles internos, não codificações de instruções RISC-V.

Para as entradas 0101 e 0011, o controle 0110 inverte a segunda entrada para 1100 e fornece vai-um inicial 1. O somador produz 0010, com vai-um de saída 1: 5 − 3 = 2, sem empréstimo sem sinal. Selecionar AND para as entradas originais produziria 0001. Os valores de entrada podem permanecer fixos enquanto uma mudança de controle seleciona outro caminho de resultado.

A fatia mais significativa também fornece informações de estouro e comparação. Uma redução de todos os bits de resultado fornece Zero. Essas saídas de estado permitem que o controle do processador ao redor teste o resultado aritmético sem armazenar um segundo resultado de largura completa.

Acrescente deslocamento ao lado do somador

Uma ULA completa para inteiros básicos do RISC-V também precisa de XOR, comparação sem sinal e deslocamentos. Um deslocador de barril usa uma sequência de níveis de multiplexadores. Cada nível deixa sua entrada passar ou a desloca por uma potência de dois. Um deslocador de 32 bits tem níveis para 1, 2, 4, 8 e 16 posições, portanto realiza qualquer deslocamento de 0 a 31 em cinco níveis.

Para deslocar 13 posições, selecione os níveis de 8, 4 e 1. Os deslocamentos selecionados se combinam em um resultado. Um deslocamento lógico à direita insere zeros. Um deslocamento aritmético à direita replica o bit de sinal, preservando o sinal de um valor negativo. Assim, 1111 0000 deslocado duas posições à direita produz 0011 1100 logicamente e 1111 1100 aritmeticamente.

Principais conclusões

  • Uma ULA calcula a partir das entradas atuais; registradores fornecem armazenamento.
  • Fatias de bits compartilham controles de operação e passam sinais de vai-um entre posições adjacentes.
  • Bnegate inverte o segundo operando e fornece o vai-um inicial para subtração.
  • Um multiplexador seleciona entre resultados aritméticos e lógicos.
  • Os níveis de um deslocador de barril combinam deslocamentos por potências de dois.

2.2 Comparar números e detectar zero na ULA

Comparações frequentemente reutilizam a subtração. A igualdade pergunta se a diferença é zero. A ordenação pergunta se a diferença matemática é negativa, o que exige cuidado extra quando uma subtração de largura fixa estoura.

Detecte igualdade em todos os bits

A saída Zero é o NOR de todos os bits do resultado:

Zero=r0+r1+⋯+rn−1‾.

Um único bit de resultado diferente de zero torna Zero falso. Subtrair dois padrões de bits iguais produz zero; dois padrões distintos de n bits não podem diferir por um múltiplo diferente de zero de 2n, portanto uma subtração que dá a volta não cria uma falsa igualdade. Um circuito alternativo de igualdade aplica XOR aos bits correspondentes dos operandos e testa se todos os resultados XOR são zero.

Corrija o sinal para menor que com sinal

A instrução slt do RISC-V grava o inteiro 1 na largura completa se o primeiro operando com sinal for menor, ou 0 caso contrário. Em uma ULA segmentada em fatias, a fatia mais significativa calcula um sinal Set e o envia de volta à entrada Less do bit 0. Todos os bits de resultado mais significativos são forçados a zero.

O sinal Set correto é

Lesssigned=sinal(a−b)⊕V.

Quando não há estouro, o sinal da diferença funciona diretamente. Quando há estouro, esse sinal é invertido em relação à diferença real, portanto o XOR com 1 o corrige.

Compare 7 com −8 em quatro bits. A subtração 0111 + 0111 + 1 produz 1111. Seu sinal sugere uma diferença negativa, mas a diferença exata é 15, fora do intervalo de −8 a 7. O estouro é 1, portanto o sinal Less corrigido é 1 XOR 1 = 0. O resultado de slt é 0000, indicando corretamente que 7 não é menor que −8.

Use o empréstimo para menor que sem sinal

A comparação sem sinal usa outro sinal:

Lessunsigned=cn‾

para uma subtração realizada com a segunda entrada invertida e vai-um inicial 1. Vai-um de saída 0 significa que foi necessário um empréstimo, portanto o primeiro operando sem sinal é menor.

Padrões de entradaComparação com sinalComparação sem sinal
0111, 10007 < −8 é falso7 < 8 é verdadeiro
1000, 0111−8 < 7 é verdadeiro8 < 7 é falso

Essa distinção aparece em slt em comparação com sltu, e nos desvios blt em comparação com bltu e bge em comparação com bgeu. Nem o sinal do resultado sozinho nem um “indicador de negativo” genérico responde às duas perguntas.

Aplique a comparação em software

Uma verificação de limites sem sinal pode rejeitar índices negativos e também índices iguais ou superiores ao comprimento do vetor:

bgeu x10, x11, IndexOutOfBounds

Aqui x10 contém o índice com sinal e x11 contém um comprimento não negativo que cabe no intervalo com sinal. Um índice negativo, reinterpretado como sem sinal, é pelo menos 2n−1 e, portanto, excede todo comprimento desse tipo. A condição sobre o comprimento importa: ela torna suficiente uma comparação sem sinal.

Conversões da linguagem também podem mudar o significado de uma comparação. Com um unsigned int de 32 bits em C, -1 < 0u é falso porque −1 é convertido em 4.294.967.295 antes da comparação. Acompanhe a conversão antes de raciocinar a partir do sinal de menos escrito.

Principais conclusões

  • Zero testa todos os bits do resultado, portanto a subtração pode implementar a igualdade.
  • A comparação menor que com sinal usa o sinal da diferença em XOR com o estouro com sinal.
  • A comparação menor que sem sinal usa o empréstimo da subtração.
  • A atribuição se menor grava 0 ou 1 na largura completa do resultado.
  • Uma verificação de limites sem sinal detecta índices negativos quando o comprimento cabe no intervalo não negativo com sinal.
  • Conversões podem mudar uma comparação de com sinal para sem sinal.

2.3 Acelerar a adição com antecipação de vai-um

O vai-um de um somador com propagação precisa atravessar cada bit em sequência. A antecipação de vai-um (carry lookahead) substitui essa espera sequencial por uma lógica que prevê os sinais de vai-um a partir dos bits dos operandos e do vai-um inicial.

Descreva o comportamento de cada bit em relação ao vai-um

Defina geração e propagação como

gi=aibi,pi=ai+bi.

Essas são expressões booleanas: multiplicação é AND e adição é OR. Geração é 1 quando o bit cria um vai-um independentemente do vai-um de entrada. Propagação é 1 quando um vai-um de entrada pode passar adiante. A recorrência é

ci+1=gi+pici.

Um bit com ambas as entradas iguais a 1 gera um vai-um; um bit com uma entrada igual a 1 passa um vai-um; um bit com ambas as entradas iguais a 0 o interrompe. Com essa definição por OR, um bit que gera vai-um também tem propagação igual a 1, o que não altera a fórmula do vai-um.

Expanda a dependência

Substitua a expressão de cada vai-um anterior:

c1=g0+p0c0 c2=g1+p1g0+p1p0c0 c3=g2+p2g1+p2p1g0+p2p1p0c0 c4=g3+p3g2+p3p2g1+p3p2p1g0+p3p2p1p0c0.

Cada expressão agora depende de sinais derivados dos operandos e do vai-um inicial, não de uma cadeia sequencial de saídas intermediárias de vai-um. Quando os sinais de vai-um estão disponíveis, cada bit de soma continua sendo o XOR de suas duas entradas e do vai-um de entrada.

Para 1011 + 0110 com vai-um inicial 0, a geração a partir do bit 0 é 0, 1, 0, 0 e a propagação é 1, 1, 1, 1. Assim, os sinais de vai-um de entrada dos bits 1 a 4 são 0, 1, 1, 1. Os quatro bits de resultado são 0001 com vai-um de saída 1, representando 11 + 6 = 17.

Construa grupos em vez de portas gigantes

Um bloco de quatro bits tem os sinais de grupo

G=g3+p3g2+p3p2g1+p3p2p1g0, P=p3p2p1p0.

Seu vai-um de saída é G+Pc0. Um segundo nível de antecipação combina esses sinais de bloco usando a mesma regra. Quatro blocos de quatro bits e uma unidade de antecipação de grupo formam um somador de 16 bits. Agrupamentos adicionais permitem projetos mais largos; somadores de prefixo paralelo, como o Kogge–Stone, organizam essas relações em uma rede rápida.

Em um modelo simples de atraso de portas, a propagação de vai-um custa cerca de dois atrasos de porta por bit, ou 32 para 16 bits. Um projeto de antecipação em dois níveis pode fornecer o último vai-um em cerca de cinco: um para os sinais de bit, dois para os sinais de grupo e dois para o vai-um de grupo. Essa estimativa conta níveis lógicos e pressupõe as portas necessárias; o atraso real também depende do tamanho das portas e das conexões. O agrupamento troca mais hardware por um caminho de vai-um que cresce aproximadamente de forma logarítmica com a largura.

Um somador com seleção de vai-um usa área de outra forma: calcula um bloco mais significativo duas vezes, uma para vai-um de entrada 0 e outra para vai-um de entrada 1. Um multiplexador seleciona o resultado correto quando chega o vai-um do bloco menos significativo.

Alguns somadores definem propagação com XOR em vez de OR. Isso também fornece sinais de vai-um corretos e permite obter a soma si=pi⊕ci. Mantenha a definição escolhida consistente ao derivar a lógica de grupo.

Principais conclusões

  • Geração cria um vai-um; propagação passa adiante um vai-um de entrada.
  • Expandir as equações de vai-um elimina a dependência sequencial de cada saída de vai-um anterior.
  • Os sinais de geração e propagação de grupo permitem que somadores largos usem vários níveis de antecipação.
  • A antecipação e a seleção de vai-um trocam área de circuito por velocidade sem alterar a soma.
3

Multiplicar e dividir inteiros em hardware

A multiplicação combina produtos parciais deslocados; a divisão decide um dígito do quociente a partir de um resto que muda. Acompanhe os dois processos em registradores pequenos e veja como operandos com sinal mudam os controles necessários. Multiplicadores mais rápidos formam e reduzem muitos produtos parciais juntos, enquanto divisores precisam lidar com dependências entre etapas. Instruções RISC-V disponibilizam metades do produto, quocientes e restos com regras precisas para entradas excepcionais.

3.1 Multiplicar com deslocamentos e somas

Cada bit do multiplicador binário escolhe uma cópia deslocada do multiplicando ou zero. Somar esses produtos parciais fornece o resultado. Um operando de n bits multiplicado por um operando de m bits pode exigir n + m bits, portanto dois operandos de 32 bits precisam de um produto completo de 64 bits.

Acompanhe deslocamentos e somas

Para operandos sem sinal de n bits, inicialize um produto de 2n bits com zero. Repita n vezes: teste o bit menos significativo do multiplicador, some o multiplicando atual se esse bit for 1, desloque o multiplicando à esquerda e desloque o multiplicador à direita. O registrador do multiplicando precisa ser largo o suficiente para manter suas cópias deslocadas.

Para 6 × 5 em quatro bits, o multiplicador é 0101:

EtapaBit menos significativo do multiplicadorMultiplicando deslocadoProduto acumulado
110000 01100000 0110
200000 11000000 0110
310001 10000001 1110
400011 00000001 1110

O produto final é 30. O bit testado e a direção do deslocamento funcionam juntos: testar o bit mais significativo enquanto o multiplicador é deslocado à direita associaria os bits aos pesos errados. Esse projeto sequencial leva n etapas, incluindo etapas cujo bit do multiplicador é zero.

Compartilhe espaço no registrador

O primeiro projeto usa um registrador de multiplicando e um somador de 2n bits. Um projeto aperfeiçoado mantém o multiplicando fixo em n bits, coloca o multiplicador na metade menos significativa de um registrador de produto de 2n bits e inicializa a metade mais significativa com zero.

Quando o bit menos significativo é 1, some o multiplicando à metade mais significativa. Mantenha o vai-um de saída do somador em um bit extra e depois desloque esse vai-um e as duas metades do produto juntos à direita. Os bits do multiplicador saem pela direita enquanto bits do produto ocupam o espaço liberado. Descartar o vai-um prejudica produtos grandes: com operandos de quatro bits, 15 × 15 se tornaria incorretamente 1 em vez de 225. Com uma etapa por clock, a implementação simples de 32 bits leva cerca de 32 ciclos.

Considere a largura do produto

Um produto sem sinal cabe em n bits exatamente quando os n bits mais significativos do produto completo são zero. Para 6 × 5, o resultado completo é 0001 1110; armazenar apenas 1110 produz 14. A multiplicação em si estava correta, mas o destino estreito descartou parte dela.

Um deslocamento de k bits à esquerda multiplica por 2k quando o resultado cabe na representação. A multiplicação por 8 torna-se um deslocamento de três posições; a multiplicação por 10 pode usar duas cópias deslocadas:

(x << 3) + (x << 1)

A operação aritmética é 8x+2x=10x. As regras de largura e da linguagem de programação ainda se aplicam aos deslocamentos e à adição; essa reescrita não cria mais bits de resultado.

Interprete as metades do resultado no RISC-V

mul retorna os XLEN bits menos significativos, em que XLEN é a largura do registrador de inteiros. mulhu retorna a metade mais significativa para operandos sem sinal. As instruções para a metade mais significativa com sinal são mulh para dois operandos com sinal e mulhsu para um primeiro operando com sinal e um segundo sem sinal.

O software que precisa do produto completo pode emitir a instrução apropriada para a metade mais significativa seguida de mul com os mesmos operandos. Uma implementação pode fundir o par. O resultado menos significativo sozinho não pode estabelecer se um produto sem sinal cabe na representação; a metade mais significativa fornece essa evidência.

Principais conclusões

  • Cada bit do multiplicador seleciona um produto parcial deslocado ou zero.
  • O produto completo pode exigir a soma das larguras dos operandos.
  • O algoritmo sequencial de deslocamentos e somas leva uma etapa por bit do multiplicador.
  • O multiplicador compacto deve preservar o vai-um da adição antes do deslocamento.
  • Um produto sem sinal cabe no formato reduzido exatamente quando sua metade mais significativa é zero.
  • O RISC-V fornece uma instrução de multiplicação para a metade menos significativa e três para a metade mais significativa, específicas para cada interpretação.

3.2 Multiplicar números com sinal e realizar multiplicações rápidas

A multiplicação com sinal deve tratar os sinais dos operandos sem perder o valor mais negativo. O hardware mais rápido também precisa reduzir muitos produtos parciais sem esperar uma adição completa com propagação de vai-um a cada vez.

Multiplique módulos com segurança

Uma abordagem registra os sinais, forma módulos sem sinal de n bits, multiplica-os em 2n bits e nega o produto completo se exatamente um operando for negativo. Para −8 em quatro bits, os bits de módulo 1000 representam 8 sem sinal. Eles não podem ser interpretados como um valor positivo com sinal de quatro bits.

Os n bits menos significativos do produto são idênticos nas interpretações com e sem sinal. 1111 × 0010 produz 30 sem sinal (0001 1110) ou −2 com sinal (1111 1110). Ambas as metades menos significativas são 1110; apenas as metades mais significativas diferem. Por isso, uma instrução mul serve às duas interpretações.

Acompanhe as decisões de Booth

O algoritmo de Booth opera diretamente com complemento de dois. Dê ao acumulador n + 1 bits e estenda o multiplicando com sinal até essa largura, para que ele e seu negativo caibam. Inicialize o acumulador com zero, coloque o multiplicador em seu registrador de n bits e acrescente um bit extra inicializado com zero.

Examine como um par o bit menos significativo do multiplicador e o bit acrescentado:

ParOperação no acumulador
10Subtrair o multiplicando
01Somar o multiplicando
00 ou 11Deixá-lo inalterado

Após cada decisão, desloque aritmeticamente à direita todo o registrador formado pelo acumulador, multiplicador e bit extra. Repita n vezes; descarte o bit acrescentado e o bit de sinal redundante mais significativo do acumulador para obter o produto de 2n bits.

Para 2 × (−3), use multiplicando 00010, multiplicador 1101 e acumulador 00000. Os pares são 10, 01, 10, 11. Após as respectivas operações e deslocamentos, acumulador e multiplicador são 11111 0110, 00000 1011, 11111 0101 e 11111 1010. Os oito bits menos significativos do produto 1111 1010 representam −6.

Um deslocamento lógico inseriria zero no extremo mais significativo e corromperia resultados parciais negativos. O bit extra do acumulador também importa: subtrair um multiplicando de n bits com o valor mais negativo exige um valor positivo indisponível em n bits com sinal.

Reduza o trabalho e os caminhos de vai-um

A recodificação de Booth substitui uma sequência de bits iguais a 1 por uma subtração na extremidade menos significativa e uma adição acima da extremidade mais significativa. Por exemplo, 126 é 128 − 2. Bits alternados podem não oferecer economia. Booth de base 4 examina dois bits do multiplicador por etapa e usa dígitos de −2 a +2, reduzindo o número de produtos parciais.

Um multiplicador rápido forma produtos parciais em paralelo. Um somador com salvamento de vai-um comprime três palavras em duas sem propagar sinais de vai-um pela palavra. Árvores de Wallace ou Dadda repetem essa redução e depois usam um somador final com propagação de vai-um. Reduzir 32 linhas a duas leva oito níveis de salvamento de vai-um. A segmentação em pipeline permite que vários produtos estejam em andamento; aceitar um por ciclo não significa que cada um termine em um ciclo.

Para um resultado com sinal reduzido a n bits, cada bit da metade mais significativa deve ser igual ao bit de sinal da metade menos significativa. Em quatro bits, −8 × −1 produz o produto completo 0000 1000. A metade mais significativa é zero, mas o bit de sinal mantido é 1, portanto +8 não cabe no destino com sinal.

Principais conclusões

  • Módulos sem sinal preservam o módulo do operando com sinal mais negativo.
  • Produtos com e sem sinal compartilham a metade menos significativa, mas podem ter metades mais significativas diferentes.
  • Booth usa um bit extra no acumulador, decisões com pares de bits e deslocamentos aritméticos à direita.
  • Sequências de bits iguais a 1 podem ser substituídas por duas operações de Booth; padrões alternados podem não economizar trabalho.
  • Árvores com salvamento de vai-um reduzem muitos produtos parciais antes de uma adição final com propagação de vai-um.
  • A segmentação em pipeline separa a latência do resultado da taxa de início de novos produtos.
  • Um produto com sinal cabe no formato reduzido quando a metade mais significativa é a extensão de sinal da metade menos significativa.

3.3 Dividir inteiros e tratar os casos especiais

A divisão produz um quociente e um resto relacionados por

dividendo=quociente×divisor+resto.

Para um divisor sem sinal diferente de zero, o resto é não negativo e menor que o divisor. Um dividendo e um divisor de n bits precisam de um quociente e um resto de n bits.

Produza o quociente um bit de cada vez

Leia os bits do dividendo a partir do extremo mais significativo. Dobre o resto parcial, incorpore o próximo bit e teste se o divisor cabe. Se couber, subtraia-o e escreva o bit de quociente 1; caso contrário, mantenha o resto parcial e escreva 0.

Para 0111 dividido por 0010, os restos parciais após incorporar cada bit são 0, 1, 3 e 3. Os dois primeiros são menores que 2, portanto seus bits de quociente são 0. Cada 3 permite uma subtração, deixando resto 1 e bit de quociente 1. O quociente é 0011 e o resto é 0001: 3 × 2 + 1 = 7.

A divisão com restauração tenta primeiro a subtração. Se o resultado da tentativa for negativo, some o divisor de volta e escreva 0; caso contrário, mantenha-o e escreva 1. Detecte a falha com um empréstimo ou uma diferença com sinal de n + 1 bits. Um teste de sinal de n bits não é seguro: em quatro bits, 0 − 9 dá a volta para 0111, cujo bit mais significativo é 0 apesar do empréstimo.

O hardware compacto coloca o dividendo na metade menos significativa de um registrador de 2n bits e o resto parcial na metade mais significativa. Ele desloca à esquerda em cada etapa e insere bits de quociente à direita. Ao final, a metade mais significativa contém o resto e a menos significativa contém o quociente.

A divisão sem restauração leva adiante um resultado de tentativa negativo e soma o divisor durante a etapa seguinte em vez de restaurar imediatamente. Um resto parcial final negativo precisa de uma última soma de volta. A divisão SRT seleciona vários bits de quociente por etapa usando os bits iniciais do divisor e do resto; entradas ausentes em uma tabela de seleção desse tipo causaram o erro FDIV do Pentium em 1994. A divisão continua dependente de cada resto parcial anterior.

Aplique a divisão com sinal por truncamento

Divida os módulos, negue o quociente se os sinais forem diferentes e atribua a um resto diferente de zero o sinal do dividendo.

CálculoQuocienteResto
−7 dividido por 2−3−1
7 dividido por −2−31
−7 dividido por −23−1

Esses resultados truncam o quociente em direção a zero e preservam a identidade da divisão. RISC-V, Java e C desde C99 usam essa regra. Em Python, // arredonda para baixo: -7 // 2 é −4 e -7 % 2 é 1.

Trate entradas excepcionais

A divisão por zero no RISC-V retorna um quociente com todos os bits ativados e o dividendo original como resto. O caso de estouro com sinal, o valor mais negativo dividido por −1, retorna o quociente mais negativo e resto zero. Nenhum dos casos gera armadilha. O x86 gera uma exceção de erro de divisão para ambos. O software que precisa informar erros verifica primeiro o zero e também verifica o par que causa estouro com sinal.

Um deslocamento lógico à direita divide valores sem sinal por potências de dois, arredondando para baixo. Um deslocamento aritmético também arredonda valores negativos para baixo: −5 deslocado uma posição à direita torna-se −3, enquanto a divisão por 2 com truncamento produz −2. Para implementar o truncamento com um deslocamento, some 2k−1 a uma entrada negativa antes de deslocá-la k posições à direita. Para −5 e k = 1, desloque −4 para obter −2.

Principais conclusões

  • O quociente e o resto devem satisfazer a identidade da divisão.
  • A divisão com restauração soma o divisor de volta após uma subtração de tentativa malsucedida.
  • É necessário um empréstimo ou um bit extra de diferença para testar com segurança uma subtração de tentativa sem sinal.
  • A divisão com sinal por truncamento atribui a um resto diferente de zero o sinal do dividendo.
  • O RISC-V define saídas sem armadilha para divisão por zero e estouro do quociente com sinal.
  • O deslocamento aritmético à direita e a divisão com sinal por truncamento diferem para valores negativos com resto.
4

Representar números reais em ponto flutuante IEEE 754

O ponto flutuante armazena um sinal, uma escala e uma quantidade limitada de bits significativos. Decodifique esses campos para distinguir intervalo de precisão e depois use os padrões de expoente reservados para reconhecer zeros, subnormais, infinitos e NaNs. Os valores especiais fazem parte do sistema aritmético: permitem que resultados minúsculos se aproximem de zero gradualmente e que operações excepcionais retornem resultados definidos enquanto registram indicadores de estado.

4.1 Codificar e decodificar formatos binários IEEE 754

Um valor normal de ponto flutuante binário tem a forma

(−1)s×1,f×2e.

O significando é o valor completo 1,f; a fração armazenada contém apenas f. A normalização garante o 1 inicial, portanto omitir esse bit oculto acrescenta um bit de precisão.

Leia os três campos
FormatoBits de sinalBits de expoenteBits de fraçãoViésPrecisão
binary1615101511 bits
binary32182312724 bits
binary6411152102353 bits

O IEEE 754-2019 define esses formatos. Precisão simples e dupla geralmente significam binary32 e binary64. A ordem de armazenamento é sinal, expoente, fração. Para um valor normal, subtraia o viés do campo de expoente sem sinal:

valor=(−1)S(1+Frac¸a˜o)2E−Vieˊs.

Fração significa a fração binária após a vírgula, não seus bits interpretados como inteiro. Em binary32, campos de expoente de 1 a 254 codificam expoentes de −126 a 127. Os campos 0 e 255 têm significados especiais.

Um viés faz com que expoentes maiores tenham campos sem sinal maiores. Para números positivos finitos, a ordenação sem sinal dos padrões completos segue a ordenação numérica. Valores negativos e NaNs exigem tratamento adicional.

Codifique e decodifique

Para codificar −0,75, escreva seu módulo como 0,112=1,12×2−1. O sinal é 1 e o campo de expoente é −1 + 127 = 126, ou 01111110. Descarte o 1 inicial oculto e preencha a fração com zeros. Os campos são 1 01111110 10000000000000000000000, resultando em 0xBF400000. Em binary64, o mesmo valor é 0xBFE8000000000000.

Para decodificar 0x41460000, divida-o em 0 10000010 10001100000000000000000. O campo de expoente é 130, portanto o expoente real é 3. O significando é

1,1000112=1+12+132+164=1,546875.

Multiplicar por 8 produz 12,375. Escrever o 1 oculto na fração armazenada alteraria o valor; armazenar −1 diretamente no campo de expoente perderia a regra do viés.

Diferencie intervalo de precisão

O binary32 alcança aproximadamente 3,40×1038, com menor normal positivo 2−126 e cerca de sete algarismos decimais significativos. O binary64 alcança aproximadamente 1,80×10308, com menor normal positivo 2−1022 e cerca de 15 a 16 algarismos significativos. O binary16 tem máximo 65.504, menor normal positivo 2−14, menor subnormal positivo 2−24 e cerca de 3,3 algarismos decimais significativos.

A precisão conta algarismos significativos, não algarismos após a vírgula decimal. Por exemplo, binary32 armazena 1.234.567,89 como 1.234.567,875.

No intervalo binary32 de 2e até 2e+1, valores normais adjacentes são espaçados por 2e−23. Esse espaçamento é uma ulp, uma unidade na última posição. Logo acima de 1, ele é 2−23, frequentemente chamado épsilon de máquina. Em 224, o espaçamento passa a ser 2, portanto 16.777.217 está ausente mesmo que números muito maiores caibam. Mais bits de expoente ampliam o intervalo de escala; mais bits de fração aproximam os valores representáveis em uma dada escala.

Principais conclusões

  • Formatos normais omitem da fração armazenada o 1 inicial garantido.
  • Decodifique um expoente normal subtraindo seu viés.
  • binary16, binary32 e binary64 têm precisão de 11, 24 e 53 bits.
  • Intervalo e precisão são limites diferentes.
  • O espaçamento entre números normais cresce com o expoente.

4.2 Usar zeros, infinitos, NaNs e números subnormais

Padrões de expoente reservados permitem que o IEEE 754 represente valores além dos números normalizados comuns. Sempre classifique os campos antes de aplicar uma fórmula de valor.

Reconheça os padrões reservados
Campo de expoenteCampo de fraçãoSignificado
Todos os bits zeroZeroZero com sinal
Todos os bits zeroDiferente de zeroSubnormal
Todos os bits ativadosZeroInfinito com sinal
Todos os bits ativadosDiferente de zeroNaN

O binary32 tem +0 em 0x00000000 e −0 em 0x80000000. Eles são iguais na comparação, mas a divisão pode revelar o sinal: 1 dividido por +0 produz +∞, enquanto 1 dividido por −0 produz −∞. Um resultado negativo minúsculo que é arredondado para zero torna-se −0.

O infinito positivo é 0x7F800000; o maior valor positivo finito é 0x7F7FFFFF. No arredondamento para o mais próximo, o estouro aritmético retorna um infinito com sinal. Dividir um valor finito diferente de zero por zero também retorna infinito com sinal, com outro indicador de exceção. Operações posteriores tratam o infinito de modo consistente: somar 1 a +∞ mantém +∞, multiplicá-lo por −2 produz −∞ e seu recíproco é +0.

Diferencie NaN de infinito

Operações como zero dividido por zero, infinito menos ele mesmo, zero vezes infinito e a raiz quadrada real de −1 não têm resultado numérico significativo. Elas produzem NaN, “não é um número”, e sinalizam operação inválida.

NaN é não ordenado: testes de igualdade e de ordenação menor que ou maior que envolvendo NaN são falsos, enquanto o de desigualdade é verdadeiro. Em particular, x == NaN não detecta NaN. Use isnan(x). NaNs silenciosos normalmente se propagam pelas operações aritméticas; NaNs sinalizadores geram operação inválida quando usados. Nesses formatos binários, o bit mais significativo da fração distingue um NaN silencioso. O NaN silencioso binary32 canônico do RISC-V é 0x7FC00000.

Aproxime-se de zero gradualmente

Um subnormal não tem 1 oculto. Seu expoente é fixado no menor expoente normal:

valor=(−1)S×0,f×21−Vieˊs.

Para binary32, 0x00000001 é 2−149 e 0x00400000 é 2−127. Para binary64, o menor valor positivo é 2−1074. Usar o expoente menos o viés com um campo de expoente zero produziria um erro de um fator de dois, mesmo antes de acrescentar incorretamente um 1 oculto.

Os subnormais proporcionam subfluxo gradual: a precisão diminui à medida que os valores diminuem, com espaçamento absoluto fixo perto de zero. Valores finitos distintos em um formato ainda têm uma diferença representável diferente de zero. Modos de substituição por zero descartam essa proteção e podem acelerar o tratamento de subnormais em alguns processadores.

Leia os indicadores de exceção

O IEEE 754 define operação inválida, divisão por zero, estouro, subfluxo e resultado inexato. O tratamento padrão retorna um resultado e registra o estado; ele não precisa interromper a execução. Resultado inexato significa que o resultado arredondado difere do resultado exato.

No tratamento padrão, o subfluxo exige que o resultado seja minúsculo e inexato. Em binary32, 2−126/2=2−127 é um subnormal exato e não ativa o indicador de subfluxo. O RISC-V registra NV, DZ, OF, UF e NX em fflags dentro de fcsr, e exceções de ponto flutuante não acionam armadilhas aritméticas. Um infinito retornado sozinho não identifica se ocorreu estouro ou divisão por zero; examine o indicador.

Principais conclusões

  • Classifique campos de expoente reservados antes de decodificar um valor normal.
  • Zeros com sinal são iguais na comparação, mas podem produzir infinitos com sinais diferentes.
  • NaN é não ordenado e deve ser detectado com um teste de NaN.
  • Subnormais usam um 0 inicial e expoente um menos o viés.
  • O subfluxo gradual preserva pequenas diferenças que a substituição por zero pode apagar.
  • Um subnormal exato não ativa o indicador de subfluxo.
5

Calcular e arredondar com números de ponto flutuante

O hardware de ponto flutuante precisa mover e combinar bits significativos antes de arredondar a resposta. Percorra alinhamento, normalização e arredondamento e depois relacione essas etapas a falhas de precisão conhecidas. Bits extras de arredondamento distinguem um empate de um valor logo acima dele, e a multiplicação e adição fundidas preservam informações que duas operações separadas podem perder. Os mesmos limites explicam somas que mudam, contadores que param e conversões arriscadas.

5.1 Somar e multiplicar números de ponto flutuante

A aritmética de ponto flutuante opera separadamente sobre significandos e expoentes. O resultado final deve ser o resultado exato da operação arredondado para o formato de destino, portanto a movimentação intermediária de bits deve preservar informações suficientes para essa última decisão.

Some com um expoente compartilhado

A adição segue quatro estágios: alinhar, operar, normalizar, arredondar. Compare os expoentes e desloque o significando do menor operando à direita pela diferença entre eles. Some os módulos para sinais iguais; subtraia os módulos para sinais opostos. Desloque o resultado para a forma normalizada e ajuste seu expoente. Depois arredonde, normalizando novamente se o arredondamento criar um vai-um.

Use significandos de quatro bits para examinar 0,5 + (−0,4375):

  1. Escreva os operandos como 1,0002×2−1 e −1,1102×2−2.
  2. Alinhe o segundo para −0,1112×2−1.
  3. Subtraia os módulos: 1,0002−0,1112=0,0012.
  4. Normalize para 1,0002×2−4, ou 0,0625. Nenhum bit diferente de zero foi perdido, portanto nenhuma alteração por arredondamento é necessária.

O cancelamento pode exigir um grande deslocamento de normalização à esquerda. O hardware usa um subtrator de expoentes, um deslocador de alinhamento, um somador de significandos, um contador de zeros à esquerda e lógica de normalização e arredondamento. Somadores de ponto flutuante geralmente são segmentados em pipeline ao longo de vários ciclos.

Um modelo decimal mostra por que algarismos extras importam: com quatro algarismos significativos, 99,99 + 0,161 é alinhado como 9,999+0,01610 na escala 101. O resultado intermediário exato é 10,01510 nessa escala. Normalize para 1,00151×102 e arredonde para 1,002×102. Cortar a parcela alinhada cedo demais perderia informações necessárias para escolher 100,2.

Multiplique escalas e significandos

Multiplique os significandos, some os expoentes reais e aplique XOR aos sinais. Com campos com viés, subtraia o viés uma vez:

Eresult=Ea+Eb−Vieˊs

antes dos ajustes de normalização. Dois significandos normais multiplicados produzem um valor de 1 até 4, portanto seu produto precisa de no máximo um deslocamento de normalização à direita. O arredondamento pode exigir outro ajuste; os limites do expoente também precisam ser verificados.

Para 0,5 × (−0,4375), os campos de expoente binary32 fornecem 126 + 125 − 127 = 124, ou expoente real −3. O produto dos significandos é 1,0002×1,1102=1,1102. O XOR dos sinais é 1, produzindo −1,1102×2−3=−0,21875.

Arredonde uma vez com multiplicação e adição fundidas

A FMA calcula a × b + c com um arredondamento após a expressão completa. A multiplicação e a adição separadas arredondam duas vezes. Em binary32, considere a=1+2−23, b=1−2−23 e c = −1. Seu produto exato é 1−2−46. Uma multiplicação separada o arredonda para 1, portanto a adição retorna zero. A FMA mantém a pequena diferença do produto e retorna −2−46.

A extensão F do RISC-V fornece 32 registradores de ponto flutuante, de f0 a f31; D amplia o mesmo banco para precisão dupla. flw/fsw e fld/fsd transferem valores. As operações aritméticas incluem fadd.s, fmul.s, fdiv.s e fsqrt.s, com formas .d para precisão dupla. fmadd.s calcula multiplicação e adição fundidas. Comparações como flt.s gravam 0 ou 1 em um registrador de inteiros, e fcvt converte formatos ou valores inteiros.

Principais conclusões

  • A adição alinha os expoentes antes de combinar os significandos.
  • A normalização altera tanto a posição do significando quanto o expoente.
  • Multiplicar campos de expoente com viés exige subtrair um viés.
  • O arredondamento pode exigir uma segunda normalização.
  • A FMA arredonda o produto mais a soma completos uma vez.
  • As operações aritméticas das extensões F e D do RISC-V usam um banco de registradores de ponto flutuante; as comparações retornam valores lógicos inteiros.

5.2 Arredondar resultados corretamente

Um formato finito não pode armazenar todo resultado exato. Arredondamento correto significa escolher o resultado representável exigido pela direção de arredondamento, como se a operação tivesse sido primeiro calculada exatamente. A aritmética básica, a raiz quadrada e a FMA obedecem a essa regra. Os bits de conteúdo e de sinal de NaN não precisam ser idênticos entre processadores.

Escolha uma direção de arredondamento
DireçãoRegra
roundTiesToEvenValor mais próximo; um empate exato escolhe um bit final do significando igual a 0
roundTowardPositiveEm direção a +∞
roundTowardNegativeEm direção a −∞
roundTowardZeroEm direção a zero
roundTiesToAwayValor mais próximo; um empate exato vai para longe de zero

As quatro primeiras são exigidas para implementações binárias; o desempate para o par é o padrão. O desempate para longe de zero é exigido para formatos decimais, e o RISC-V também o fornece para operações binárias. Seus nomes são RNE, RUP, RDN, RTZ e RMM; uma instrução pode selecionar um modo diretamente ou usar o modo dinâmico em fcsr.

Para desempate para o par ao arredondar para inteiros, 2,5 torna-se 2 e 3,5 torna-se 4. Em binário, com significandos de quatro bits, 1,00112 é arredondado para 1,0102, e 1,01012 também é arredondado para 1,0102. O bit par pertence ao significando mantido, não ao expoente ou a um algarismo decimal exibido.

Mantenha informações de guarda, arredondamento e aderência

Após a normalização, mantenha dois bits adicionais além do significando de destino: guarda e arredondamento. O bit de aderência é o OR de todos os bits descartados posteriores. Ele registra se toda essa parte restante é zero.

Para arredondamento ao mais próximo, guarda 0 significa abaixo da metade. Guarda 1 com arredondamento ou aderência igual a 1 significa acima da metade. Guarda 1 com os dois indicadores posteriores iguais a 0 significa um empate exato. Em um empate, incremente o significando mantido somente se seu bit menos significativo atual for 1.

Para uma soma de 8 + 0,5625 com significandos de quatro bits, o alinhamento fornece

1,00010012×23.

Mantenha 1.000; guarda é 1, arredondamento é 0 e aderência é 1 porque a parte restante contém um 1. O valor está acima da metade, portanto incremente para 1,0012×23=9. Descartar a aderência transformaria isso falsamente em um empate e escolheria 8.

Um bit de aderência é uma evidência sobre todos os bits perdidos, não apenas o terceiro bit após a parte mantida. Durante o deslocamento, quando algum bit perdido é 1, o estado de aderência permanece em 1 para essa parte acumulada.

Interprete erro e estouro

Para resultados finitos dentro do intervalo, o arredondamento para o mais próximo tem erro absoluto de no máximo meia ulp; o arredondamento direcionado tem erro menor que uma ulp. Para resultados normais binary32, o limite relativo usual do arredondamento para o mais próximo é 2−24; para binary64, é 2−53. Resultados subnormais exigem raciocínio com erro absoluto porque sua precisão relativa diminui.

A direção de arredondamento também controla os resultados de estouro. Um estouro positivo produz +∞ no arredondamento para o mais próximo ou em direção ao positivo, mas o maior valor positivo finito no arredondamento em direção a zero ou ao negativo. Um estouro negativo produz o comportamento inverso.

Conversões para inteiros têm regras próprias. Em C, conversões representáveis como (int)2.7 e (int)-2.7 truncam para 2 e −2, independentemente da direção atual de arredondamento em ponto flutuante. Verifique o intervalo de destino e a parte fracionária descartada.

Principais conclusões

  • O arredondamento correto escolhe o valor de destino a partir do resultado exato e da direção de arredondamento.
  • Um empate exato no arredondamento para o mais próximo escolhe o vizinho cujo bit menos significativo mantido é 0.
  • Guarda e arredondamento preservam dois bits extras; aderência registra qualquer parte posterior diferente de zero.
  • Um bit de aderência diferente de zero pode distinguir um resultado acima da metade de um empate.
  • A direção de arredondamento controla se o estouro retorna infinito ou um limite finito.

5.3 Prever e evitar erros de precisão

Erros de ponto flutuante frequentemente decorrem diretamente do espaçamento finito. Separe o erro já presente nos operandos armazenados do arredondamento realizado por uma operação e da informação perdida durante uma conversão.

Identifique o erro de representação

Uma fração irredutível tem expansão binária finita exatamente quando seu denominador é uma potência de dois. Valores como 0,5, 0,25 e 0,375 são exatos. A expansão de 0,1 se repete, portanto binary32 armazena 0x3DCCCCCD, cerca de 0,10000000149011612. binary64 também armazena uma aproximação.

Consequentemente, 0.1 + 0.2 em binary64 produz 0,30000000000000004, diferente do valor armazenado mais próximo de 0,3. Um resultado curto exibido, como 0.1, pode ser o menor decimal que, convertido de volta, produz os mesmos bits armazenados; isso não estabelece exatidão.

Para resultados finitos aproximados, use uma tolerância escolhida para o problema, por exemplo

∣a−b∣≤max⁡(atol,rtolmax⁡(∣a∣,∣b∣)).

A tolerância absoluta trata valores próximos de zero; a tolerância relativa varia com o módulo. As tolerâncias devem refletir o cálculo e o erro aceitável, não apenas o número de algarismos exibidos.

Observe a adição perder uma entrada pequena

A absorção ocorre no arredondamento para o mais próximo quando uma pequena parcela não consegue mover um operando grande para seu próximo vizinho representável. Em binary32, 16.777.216 + 1 é arredondado de volta para 16.777.216: os valores vizinhos estão separados por dois, e esse empate seleciona o significando par. Um contador float que soma 1 pode, portanto, parar de avançar.

Alterar a ordem da adição pode alterar a resposta. Com binary32, x = −1,5 × 10³⁸, y = 1,5 × 10³⁸ e z = 1, (x + y) + z produz 1. Mas y + z é arredondado para y, portanto x + (y + z) produz zero. A adição não é associativa. Reduções paralelas podem mudar seu agrupamento quando a quantidade de threads muda, afetando os bits finais.

O arredondamento repetido também se acumula: somar 0,1 em binary32 dez milhões de vezes a um total binary32 produz 1.087.937 em vez de 1.000.000. Um acumulador mais largo reduz a perda por arredondamento. Somar primeiro módulos menores também pode preservar contribuições que um total acumulado grande absorveria.

Separe cancelamento de subtração inexata

O cancelamento remove algarismos iniciais comuns de operandos quase iguais. A subtração em si pode ser exata enquanto erros anteriores dos operandos se tornam grandes em relação à resposta pequena. Em binary32, 1,0000001 é armazenado como 1+2−23. Subtrair 1 produz cerca de 1,1920929×10−7 em vez de 1,0×10−7, aproximadamente 19% de erro relativo.

Verifique conversões e escolhas de formato

binary64 representa exatamente todo inteiro de 32 bits. binary32 não: 16.777.217 é arredondado para 16.777.216 no desempate para o par. Acima de 253, binary64 também deixa de representar alguns inteiros. Converter um valor de ponto flutuante para um tipo inteiro menor pode ultrapassar completamente seu intervalo.

No primeiro voo do Ariane 5, em 1996, uma conversão fora do intervalo de ponto flutuante de 64 bits para um inteiro com sinal de 16 bits desligou os sistemas de referência inercial e contribuiu para a perda do foguete. Na falha do Patriot em 1991, em Dhahran, uma aproximação truncada de 0,1 em ponto fixo acumulou cerca de 0,34 s de erro de tempo após cerca de 100 horas, deslocando a janela de rastreamento em cerca de 687 m. Esse foi um erro de representação em ponto fixo, não uma operação IEEE de ponto flutuante.

Escolha binary64 para maior precisão de uso geral, binary32 quando seu menor uso de memória for adequado à tarefa e binary16 ou bfloat16 para cargas de trabalho adequadas de baixa precisão. bfloat16 tem oito bits de expoente e sete de fração. Valores monetários exatos pertencem a unidades monetárias menores expressas em inteiros ou a um tipo decimal.

Principais conclusões

  • Uma fração binária finita exige um denominador que seja potência de dois após a redução.
  • Uma saída decimal curta pode ocultar erro de representação.
  • A absorção e o arredondamento repetido podem alterar somas e parar contadores de ponto flutuante.
  • A adição em ponto flutuante não é associativa, portanto o agrupamento afeta a reprodutibilidade.
  • O cancelamento expõe o erro anterior dos operandos em relação a uma pequena diferença.
  • Conversões exigem verificações de precisão e de intervalo.
  • A escolha do formato depende da precisão, do intervalo e do custo de armazenamento necessários.

Exercícios resolvidos de Aritmética computacional

5 Lições Interativas

1

Acompanhar um somador e avaliar seu resultado

12 passos
Acompanhe adição e subtração em um somador de 8 bits e depois diferencie os sinais usados nas verificações de intervalo com e sem sinal.
  1. 1
    IntroduçãoPrimeiro os bits, depois a interpretação

    Um somador de 8 bits mantém oito bits de soma e produz um vai-um de saída. Os mesmos bits de soma podem representar um valor sem sinal ou um valor com sinal em complemento de dois. Se eles correspondem ao resultado pretendido depende dessa interpretação.

    Comece com 58 + 27. Ambos os valores cabem nas duas interpretações, portanto você pode acompanhar primeiro o circuito e depois examinar os intervalos.

  2. 2
    ExplicaçãoUma posição combina três bits

    Um somador completo combina dois bits de entrada e o vai-um de entrada. Sua soma é o XOR deles. Seu vai-um de saída é 1 quando pelo menos duas das três entradas são 1.

    Em um somador com propagação de vai-um, esse vai-um de saída torna-se o vai-um de entrada da posição seguinte. Apenas a posição menos significativa recebe diretamente o vai-um inicial. Para adição comum, o vai-um inicial é zero.

  3. 3
    ExemploCalcule as colunas menos significativas

    Escreva 58 como 0011 1010 e 27 como 0001 1011. Começando pela direita, o bit 0 soma 0 e 1 com vai-um 0, produzindo soma 1 e vai-um 0.

    O bit 1 soma 1 e 1, produzindo soma 0 e vai-um 1. O bit 2 então soma 0 e 0 com esse vai-um, produzindo soma 1 e vai-um 0. O vai-um deve ser incluído onde chega, mesmo quando ambos os bits dos operandos são zero.

  4. 4
    ExemploConclua a soma

    Continue pelas posições mais significativas. O bit 3 soma dois bits iguais a 1, produzindo soma 0 e vai-um 1. O bit 4 combina dois bits iguais a 1 com esse vai-um, produzindo soma 1 e vai-um 1. O bit 5 combina 1, 0 e 1, produzindo soma 0 e vai-um 1. O bit 6 recebe esse vai-um e produz 1.

    O resultado completo é 0101 0101, ou 85. O vai-um final é 0, e o resultado com sinal permanece positivo.

  5. 5
    DesafioEscolha a extensão

    Um operando com sinal de 4 bits 1011 deve ser somado a um operando de 8 bits. Qual padrão de 8 bits preserva seu valor e o que a extensão com zeros faria?

    ---reveal---

    A extensão de sinal produz 1111 1011, ainda −5. A extensão com zeros produz 0000 1011, ou +11, alterando a entrada antes da adição. A extensão segue a interpretação do operando, não a largura do outro operando.

  6. 6
    ExemploReutilize o somador para subtração

    Agora calcule 58 − 27. Inverta 0001 1011 para 1110 0100 e defina o vai-um inicial como 1. Some 0011 1010 + 1110 0100 + 1 para obter 0001 1111, com vai-um de saída 1.

    O resultado é 31. Nessa subtração sem sinal, vai-um de saída 1 significa ausência de empréstimo. Inverter o segundo operando sem o 1 inicial produziria 30.

  7. 7
    Ideia-chaveVai-um e estouro respondem a perguntas diferentes

    O vai-um de saída informa se uma adição sem sinal excedeu os bits disponíveis. O estouro com sinal testa o intervalo com sinal: parcelas de mesmo sinal não devem produzir um resultado de sinal oposto.

    O hardware calcula o estouro com sinal aplicando XOR ao vai-um de entrada e ao vai-um de saída do bit de sinal. Pode haver vai-um sem estouro com sinal, estouro com sinal sem vai-um, ambos ou nenhum.

  8. 8
    ExemploUma soma válida sem sinal pode falhar com sinal

    Some 90 e 60 em 8 bits. O resultado é 1001 0110, com vai-um de saída 0. O valor sem sinal 150 cabe no intervalo de 0 a 255.

    Ambas as entradas com sinal são positivas, mas a interpretação com sinal armazenada é −106. Portanto, o estouro com sinal é 1. O padrão armazenado continua sendo os oito bits menos significativos de 150; é o intervalo do destino com sinal que não comporta o resultado exato.

  9. 9
    DesafioInterprete os dois sinais

    Um somador de 8 bits soma 1111 0110 e 0001 0100, produzindo 0000 1010 com vai-um de saída 1. O que as interpretações sem sinal e com sinal mostram?

    ---reveal---

    Sem sinal, 246 + 20 = 266 estoura e armazena 10. Com sinal, −10 + 20 = 10 cabe, portanto o estouro com sinal é 0. A adição de sinais opostos não pode estourar o intervalo com sinal, embora esse cálculo de bits tenha um vai-um de saída.

  10. 10
    ConexãoO programa decide como responder

    A instrução add do RISC-V retorna os bits menos significativos sem indicadores ou armadilha de estouro. Uma verificação sem sinal pode comparar a soma com uma entrada; um resultado menor sinaliza que houve volta. A verificação com sinal deve usar relações com sinal.

    As regras da linguagem também importam. A adição sem sinal em C dá a volta, enquanto o estouro com sinal é indefinido. A adição de inteiros em Java dá a volta, e os inteiros do Python crescem. Acompanhar corretamente os bits, por si só, não determina o comportamento no nível da linguagem.

  11. 11
    DesafioRelacione subtração ao intervalo com sinal

    Uma ULA de 8 bits calcula 100 − (−35). Qual valor com sinal é armazenado e qual interpretação exige informar estouro?

    ---reveal---

    O resultado exato com sinal é 135, cujos oito bits menos significativos são 1000 0111, interpretados como −121. A subtração com sinal estoura porque as entradas têm sinais diferentes e o sinal do resultado difere do sinal de 100. Interpretar o segundo padrão como 221 sem sinal produz 100 − 221, que precisa de um empréstimo sem sinal.

  12. 12
    RecapitulaçãoEscolha um teste de intervalo após acompanhar os bits

    Adição e subtração compartilham somadores completos, com inversão e vai-um inicial selecionando a subtração. Estenda cada entrada conforme seu significado antes de operar.

    Depois, verifique vai-um ou empréstimo para valores sem sinal e estouro para valores com sinal. Em seguida, aplique as regras do processador e da linguagem. A aritmética de saturação faz outra escolha: limita um resultado fora do intervalo a uma extremidade em vez de manter os bits menos significativos que deram a volta.

2

Construir uma ULA que compara corretamente

14 passos
Selecione resultados aritméticos e lógicos, corrija a comparação menor que com sinal após estouro e encurte o caminho do vai-um.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoVários resultados, uma saída selecionada
  2. 2
    ExplicaçãoRepita uma fatia de um bit
  3. 3
    ExemploDecodifique os controles de um projeto
  4. 4
    DesafioConstrua NOR com as mesmas portas
  5. 5
    ConexãoDesloque pelas distâncias selecionadas
  6. 6
    ExplicaçãoReduza o resultado a Zero
  7. 7
    ExemploVeja um sinal enganoso da diferença
  8. 8
    DesafioInterprete os mesmos padrões de duas formas
  9. 9
    ExplicaçãoDescreva um vai-um antes que ele chegue
  10. 10
    ExemploPreveja o vai-um final de um bloco
  11. 11
    DesafioUm vai-um gerado encontra uma interrupção
  12. 12
    Ideia-chaveUse portas para reduzir a espera
  13. 13
    DesafioMantenha a comparação correta com um somador mais rápido
  14. 14
    RecapitulaçãoSepare seleção, interpretação e velocidade
3

Acompanhar um produto e um quociente no hardware

18 passos
Acompanhe a multiplicação sem sinal, a recodificação de Booth e a divisão com restauração e depois aplique regras de sinal e verificações de largura.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoProdutos combinam linhas; quocientes resultam de decisões
  2. 2
    ExemploEscolha produtos parciais para 9 vezes 6
  3. 3
    ExemploConclua as contribuições selecionadas
  4. 4
    Ideia-chavePreserve o vai-um do multiplicador compacto
  5. 5
    DesafioVerifique um produto sem sinal em formato estreito
  6. 6
    ExplicaçãoMantenha o módulo com sinal em bits sem sinal
  7. 7
    ExplicaçãoPrepare o registrador de Booth
  8. 8
    ExemploExecute as duas primeiras etapas de Booth
  9. 9
    ExemploConclua o produto com sinal
  10. 10
    DesafioTeste se o resultado com sinal cabe após a multiplicação
  11. 11
    ConexãoComprima linhas em vez de concluir cada soma
  12. 12
    ExemploIncorpore os primeiros bits do dividendo
  13. 13
    ExemploComplete o quociente e o resto
  14. 14
    DesafioAplique a regra do resto com sinal
  15. 15
    DicaUse o empréstimo na subtração de tentativa
  16. 16
    DesafioRelacione um atalho de divisão à multiplicação
  17. 17
    ConexãoInterprete resultados excepcionais do RISC-V
  18. 18
    RecapitulaçãoVerifique a identidade e o destino
4

Decodificar bits de ponto flutuante antes de calcular

12 passos
Codifique um valor normal, relacione espaçamento e precisão e classifique zeros, subnormais, infinitos e NaNs.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoUma escala e um conjunto limitado de algarismos
  2. 2
    ExemploNormalize o módulo
  3. 3
    ExemploSome o viés e monte os campos
  4. 4
    DesafioDecodifique outro valor normal
  5. 5
    ExplicaçãoO intervalo não garante detalhes inteiros
  6. 6
    ExplicaçãoClassifique primeiro os expoentes reservados
  7. 7
    ExemploDecodifique um subnormal sem 1 oculto
  8. 8
    Ideia-chaveUm resultado minúsculo exato não precisa de indicador de subfluxo
  9. 9
    DesafioDiferencie infinito de um resultado inválido
  10. 10
    DicaTeste NaN sem igualdade
  11. 11
    DesafioRelacione a codificação ao subfluxo gradual
  12. 12
    RecapitulaçãoInterprete os campos antes de avaliar um valor
5

Alinhar, arredondar e explicar a perda de precisão

18 passos
Acompanhe operações de ponto flutuante, use informações de guarda, arredondamento e aderência e preveja erros de absorção, cancelamento e conversão.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoMantenha informações até a decisão de arredondamento
  2. 2
    ExemploAlinhe uma adição
  3. 3
    ExemploNormalize antes de escolher o vizinho
  4. 4
    ExplicaçãoMultiplique com uma correção de viés
  5. 5
    DesafioCorrija um cálculo de expoente
  6. 6
    ExplicaçãoUm bit mantido par resolve um empate
  7. 7
    ExemploAcompanhe guarda, arredondamento e aderência
  8. 8
    DesafioDiferencie um empate de um valor próximo
  9. 9
    ConexãoA direção de arredondamento altera resultados negativos
  10. 10
    Ideia-chaveA FMA preserva um produto até depois da adição
  11. 11
    ExplicaçãoUma entrada decimal pode chegar já arredondada
  12. 12
    ExemploUm contador alcança uma barreira de espaçamento
  13. 13
    DesafioPreveja uma mudança de agrupamento
  14. 14
    Ideia-chaveUma subtração exata pode expor um erro anterior
  15. 15
    DicaEscolha uma tolerância que funcione perto de zero
  16. 16
    DesafioVerifique uma conversão de ida e volta de inteiro
  17. 17
    DesafioCombine alinhamento, aderência e absorção
  18. 18
    RecapitulaçãoLocalize a perda de informação

Questões de Aritmética computacional

60 Questões de Prática em 6 conjuntos

Conjunto 1: Somas de inteiros, subtração e decisões da ULA10 Questões de Prática

Questão 1 de 10

Um somador completo recebe bits de operandos 1 e 0 com vai-um de entrada 1. Que bit de soma e vai-um de saída ele produz?
  1. Soma 1, vai-um 0
  2. Soma 1, vai-um 1
  3. Soma 0, vai-um 1
  4. Soma 0, vai-um 0
Mostrar respostaOcultar resposta
Resposta: C
As três entradas somam dois, escrito em binário como 10, portanto o bit de soma é 0 e o vai-um é 1. Um bit de soma igual a 1 resultaria de ignorar o vai-um de entrada e aplicar XOR apenas aos dois bits dos operandos; um somador completo deve incluir as três entradas.

Questão 2 de 10

Um subtrator de 8 bits inverte o segundo operando, mas deixa acidentalmente o vai-um de entrada inicial em 0. Que resultado com sinal ele produz para 42 − 17?
  1. 24
  2. 25
  3. 26
  4. −25
Mostrar respostaOcultar resposta
Resposta: A
A inversão sem o 1 inicial calcula a − b − 1, portanto esse circuito retorna 42 − 17 − 1 = 24. O 25 pretendido exige o vai-um de entrada extra que completa o complemento de dois de 17; a inversão sozinha não é uma negação.

Questão 3 de 10

Quais são o vai-um de saída e o estouro com sinal para a adição de 8 bits 118 + 19?
  1. Vai-um 1, estouro 0
  2. Vai-um 0, estouro 0
  3. Vai-um 1, estouro 1
  4. Vai-um 0, estouro 1
Mostrar respostaOcultar resposta
Resposta: D
A soma é 137, abaixo do máximo sem sinal 255, portanto o vai-um de saída é 0. Seu padrão armazenado tem bit de sinal 1 apesar de duas entradas positivas com sinal, portanto o estouro com sinal é 1; usar apenas o intervalo sem sinal levaria à conclusão incorreta de que as duas interpretações cabem.

Questão 4 de 10

Qual componente da ULA seleciona um resultado entre as saídas candidatas de AND, OR e do somador?
  1. A cadeia de vai-um
  2. O multiplexador de saída
  3. O circuito de extensão de sinal
  4. O registrador de operando
Mostrar respostaOcultar resposta
Resposta: B
O multiplexador de saída encaminha um resultado candidato conforme os controles de operação. A cadeia de vai-um ajuda a calcular a soma, mas não escolhe entre os caminhos aritmético e lógico, enquanto o registrador de operando guarda um valor em vez de selecionar um resultado da ULA.

Questão 5 de 10

Qual padrão de 8 bits preserva o valor do operando com sinal de 4 bits 1101?
  1. 0000 1101
  2. 1111 1101
  3. 1000 1101
  4. 0000 0011
Mostrar respostaOcultar resposta
Resposta: B
A entrada representa −3, portanto a extensão de sinal copia seu 1 inicial para cada bit mais significativo acrescentado. O resultado 1111 1101 ainda representa −3; a extensão com zeros para 0000 1101 reinterpretaria o padrão original como 13 sem sinal e alteraria seu valor com sinal.

Questão 6 de 10

Para as entradas de 4 bits a = 0101 e b = 1010, quais resultados na largura completa slt com sinal e sltu sem sinal produzem?
  1. slt: 0001; sltu: 0000
  2. slt: 0001; sltu: 0001
  3. slt: 0000; sltu: 0000
  4. slt: 0000; sltu: 0001
Mostrar respostaOcultar resposta
Resposta: D
As interpretações com sinal são 5 e −6, portanto 5 < −6 é falso e slt retorna 0. As interpretações sem sinal são 5 e 10, portanto sltu retorna 1; aplicar uma interpretação com sinal às duas instruções deixaria de explicar por que os mesmos bits produzem comparações diferentes.

Questão 7 de 10

O que a adição de saturação sem sinal de 8 bits retorna para 220 + 70?
  1. 255
  2. 34
  3. 254
  4. 290
Mostrar respostaOcultar resposta
Resposta: A
A soma exata 290 está acima do máximo sem sinal de 8 bits, portanto a saturação a limita a 255. Manter apenas os oito bits menos significativos produziria 34, mas isso é aritmética que dá a volta; a saturação preserva uma extremidade do intervalo em vez do resíduo módulo 256.

Questão 8 de 10

Um deslocador de barril de 64 bits usa estágios de deslocamento por potências de dois. Quais estágios são selecionados para um deslocamento de 37?
  1. 32, 4 e 2
  2. 16, 8, 4 e 1
  3. 32, 4 e 1
  4. 32, 8 e 1
Mostrar respostaOcultar resposta
Resposta: C
As distâncias selecionadas devem somar 37, e 32 + 4 + 1 faz isso. Escolher 32, 4 e 2 produz 38, um deslocamento com erro de uma posição; as distâncias dos estágios representam a decomposição binária da quantidade solicitada, não as posições dos bits do valor deslocado.

Questão 9 de 10

Uma rotina de 8 bits que dá a volta calcula (115 + 29) − 40 e depois usa o resultado final com sinal. Qual é o resultado e o histórico de estouro?
  1. 104; ambas as operações estouram com sinal
  2. 104; apenas a adição estoura com sinal
  3. −152; apenas a subtração estoura com sinal
  4. −112; nenhuma operação estoura com sinal
Mostrar respostaOcultar resposta
Resposta: A
A primeira soma, 144, armazena −112 e estoura com sinal. Subtrair 40 de −112 produz −152, que dá a volta para 104 e também estoura com sinal; a aritmética modular recupera o valor final que cabe, embora testar apenas a adição inicial deixasse de detectar o segundo estouro.

Questão 10 de 10

Uma ULA de 8 bits subtrai dois padrões idênticos 1001 0110. Quais são seu resultado e sua saída Zero?
  1. Resultado 0000 0000, Zero 0
  2. Resultado 1111 1111, Zero 0
  3. Resultado 0000 0000, Zero 1
  4. Resultado 0000 0001, Zero 0
Mostrar respostaOcultar resposta
Resposta: C
Subtrair um padrão de bits de si mesmo produz bits de resultado todos iguais a zero, e a redução NOR, portanto, define Zero como 1. Um resultado com todos os bits iguais a 1 viria da inversão do segundo operando sem o +1 inicial, o que calcularia um a menos que a diferença pretendida.
Conjunto 2: Redes de vai-um e formação de produtos10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Com propagação por OR, quais são os valores de geração e propagação para bits de operandos 1 e 1?
  1. Geração 1, propagação 0
  2. Geração 1, propagação 1
  3. Geração 0, propagação 1
  4. Geração 0, propagação 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

De quantos bits o produto completo sem sinal de um operando de 7 bits por um operando de 9 bits pode precisar?
  1. 9 bits
  2. 15 bits
  3. 18 bits
  4. 16 bits
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Qual produto completo de 8 bits e qual resultado mantido de 4 bits menos significativos resultam de 11 × 3 sem sinal?
  1. Completo 0010 0001; menos significativos 0001
  2. Completo 0001 0001; menos significativos 0001
  3. Completo 0010 0001; menos significativos 0010
  4. Completo 0001 1110; menos significativos 1110
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um bloco de 4 bits tem geração de grupo 0 e propagação de grupo 1. Qual é o vai-um de saída para vai-um de entrada 0 e para vai-um de entrada 1?
  1. 1 para entrada 0; 1 para entrada 1
  2. 0 para entrada 0; 0 para entrada 1
  3. 0 para entrada 0; 1 para entrada 1
  4. 1 para entrada 0; 0 para entrada 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que um estágio com salvamento de vai-um faz com três palavras de produtos parciais?
  1. Produz uma palavra com cadeia completa de vai-um
  2. Produz duas palavras após cadeia completa de vai-um
  3. Produz três palavras sem cadeia completa de vai-um
  4. Produz duas palavras sem cadeia completa de vai-um
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Em uma verificação de limites de 32 bits, o índice é −2 e o comprimento não negativo, dentro do intervalo com sinal, é 20. O que uma comparação sem sinal de índice ≥ comprimento informa?
  1. Falso, portanto o índice é aceito
  2. Verdadeiro, portanto o índice é rejeitado
  3. Verdadeiro, pois −2 com sinal excede 20
  4. Falso, pois −2 é limitado a zero
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma rotina RV32 precisa do produto completo de um operando sem sinal por outro operando sem sinal. Quais resultados ela deve combinar?
  1. mulh como metade mais significativa e mul como menos significativa
  2. mul como metade mais significativa e mulhu como menos significativa
  3. mulhu como metade mais significativa e mul como menos significativa
  4. mulhsu como metade mais significativa e mulh como menos significativa
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um bloco de antecipação de 4 bits com propagação por OR soma a = 1001 e b = 0111 com vai-um inicial 0. Quais são a geração de grupo, a propagação de grupo e o vai-um final?
  1. G = 1, P = 1, vai-um = 1
  2. G = 0, P = 1, vai-um = 0
  3. G = 1, P = 0, vai-um = 1
  4. G = 0, P = 1, vai-um = 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um multiplicador de 4 bits recebe os padrões 1110 e 0011. Quais metades mais significativas resultam das multiplicações com e sem sinal e algum dos produtos cabe em seu respectivo intervalo de 4 bits?
  1. Com sinal: metade 1111, não cabe; sem sinal: metade 0010, cabe
  2. Com sinal: metade 1111, cabe; sem sinal: metade 0010, não cabe
  3. Com sinal: metade 0000, cabe; sem sinal: metade 0010, não cabe
  4. Com sinal: metade 1111, cabe; sem sinal: metade 0000, cabe
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma subtração com sinal que estourou tem bit de sinal armazenado 0. Qual resultado de comparação menor que com sinal a ULA deve produzir?
  1. 0
  2. O bit de vai-um de saída
  3. A saída Zero
  4. 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Produtos com sinal, divisão e atalhos aritméticos10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual grandeza fornece o sinal de um resto diferente de zero na divisão com sinal por truncamento?
  1. O divisor
  2. O quociente
  3. O operando de menor módulo
  4. O dividendo
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Qual quociente e resto a divisão com sinal do RISC-V produz para 23 dividido por −6?
  1. Quociente −4, resto −1
  2. Quociente −3, resto 5
  3. Quociente −3, resto −5
  4. Quociente 3, resto 5
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Em uma etapa de Booth, A = 0, multiplicando = −7 e o par de bits menos significativos é 10. Qual valor o acumulador deve ter antes do deslocamento?
  1. −7
  2. 0
  3. +7
  4. −1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

A adição na metade mais significativa de um multiplicador compacto sem sinal produz vai-um 1. Para onde esse vai-um deve ir durante o próximo deslocamento combinado à direita?
  1. Para a posição mais significativa da metade superior
  2. Para a posição menos significativa do multiplicador
  3. Para o vai-um de entrada inferior da próxima etapa
  4. Para fora do produto armazenado por completo
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma rotina RV32 calcula q = div(a, b), r = rem(a, b) e depois q × b + r com aritmética que dá a volta. Para a = −2³¹ e b = −1, o que acontece?
  1. q = −2³¹, r = 0; a reconstrução retorna 2³¹ − 1
  2. q = 2³¹ − 1, r = −1; a reconstrução retorna −2³¹
  3. q = −2³¹, r = 0; a reconstrução retorna −2³¹
  4. q = 2³¹, r = 0; a reconstrução retorna −2³¹
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Um divisor com restauração de quatro bits tem resto parcial 2 e divisor 11 antes de uma subtração de tentativa. Qual padrão de tentativa e qual ação são necessários?
  1. Tentativa 0111; manter e escrever 1
  2. Tentativa 1001; restaurar e escrever 0
  3. Tentativa 1001; manter e escrever 1
  4. Tentativa 0111; restaurar e escrever 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma implementação de Booth de 4 bits usa um acumulador de 5 bits para o multiplicando −8 e o multiplicador 1. Quais são a primeira atualização do acumulador e o produto final de 8 bits?
  1. Primeiro −8 (11000); produto 1111 1000
  2. Primeiro +8 (01000); produto 1111 1000
  3. Primeiro +8 (01000); produto 0000 1000
  4. Primeiro −8 (11000); produto 0000 1000
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Uma rotina com sinal substitui a divisão por truncamento de −29 por 8 por um deslocamento à direita. Qual ajuste e qual resultado deslocado preservam o quociente?
  1. Somar 7 e deslocar para −3
  2. Somar 0 e deslocar para −4
  3. Somar 3 e deslocar para −4
  4. Somar 8 e deslocar para −2
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um multiplicador segmentado em pipeline tem latência de quatro ciclos e aceita uma nova multiplicação a cada ciclo. Quando uma segunda multiplicação independente pode começar após o início da primeira?
  1. Quatro ciclos depois
  2. Três ciclos depois
  3. Dois ciclos depois
  4. Um ciclo depois
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Qual expressão de deslocamentos e somas equivale a 12x quando todos os resultados intermediários cabem e a linguagem permite os deslocamentos?
  1. (x << 3) + (x << 2)
  2. (x << 3) + (x << 1)
  3. (x << 4) + (x << 2)
  4. (x << 3) + x
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Campos de ponto flutuante e valores excepcionais10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Qual expoente real um campo de expoente binary32 normal de valor 123 codifica?
  1. −4
  2. 4
  3. −3
  4. 123
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

O que representa um padrão binary32 com todos os bits do expoente ativados e uma fração diferente de zero?
  1. Um subnormal
  2. Infinito
  3. NaN
  4. Um valor normal
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um valor binary32 normal tem sinal 1, campo de expoente 125 e fração 101 seguida de zeros. Qual é seu valor?
  1. −0,15625
  2. −0,40625
  3. −1,625
  4. −0,8125
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Quais sinal, campo de expoente e prefixo de fração em binary32 codificam −10,5?
  1. Sinal 1; expoente 130; fração 10101…
  2. Sinal 1; expoente 124; fração 0101…
  3. Sinal 0; expoente 130; fração 0101…
  4. Sinal 1; expoente 130; fração 0101…
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Qual é o valor do padrão subnormal positivo binary32 0x00000008?
  1. 2⁻¹⁴⁹
  2. 2⁻¹⁴⁷
  3. 2⁻¹⁴⁶
  4. 2⁻¹²⁶
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Dois significandos positivos normais de ponto flutuante multiplicados resultam em 11,01₂ com expoente real inicial 4. Qual produto normalizado resulta antes do arredondamento?
  1. 1,101₂ × 2⁵
  2. 1,101₂ × 2³
  3. 1,101₂ × 2⁴
  4. 1,010₂ × 2⁵
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Dois valores binary32 positivos normais são 2⁻⁸⁰ e 2⁻⁶⁰. Seu produto exato é representável em binary32. Qual é a classe do resultado e qual é o estado do indicador de subfluxo no tratamento padrão?
  1. Subnormal; indicador de subfluxo ativado
  2. Normal; indicador de subfluxo desativado
  3. Zero; indicador de subfluxo ativado
  4. Subnormal; indicador de subfluxo desativado
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um resultado binary32 é calculado como (−6,0)/(−0,0) no tratamento padrão e depois comparado consigo mesmo para verificar igualdade. Qual valor, indicador recém-ativado e resultado da comparação ocorrem?
  1. −∞; divisão por zero; verdadeiro
  2. +∞; divisão por zero; verdadeiro
  3. +∞; operação inválida; falso
  4. NaN; operação inválida; falso
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um formato binary32 é substituído por outro com o mesmo campo de expoente, mas dois bits de fração a menos. Para módulos de 2¹⁰ até valores abaixo de 2¹¹, como o espaçamento muda?
  1. De 2⁻¹³ para 2⁻¹⁵
  2. De 2⁻¹⁰ para 2⁻⁸
  3. De 2⁻¹³ para 2⁻¹¹
  4. De 2⁻¹³ para 2⁻¹²
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Qual categoria de instruções RISC-V grava seu resultado em um registrador de inteiros, embora compare entradas de ponto flutuante?
  1. Adições de ponto flutuante como fadd.s
  2. Comparações de ponto flutuante como flt.s
  3. Produtos de ponto flutuante como fmul.s
  4. Multiplicações e adições fundidas como fmadd.s
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Decisões de arredondamento e perda de precisão10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um empate exato com significando de quatro bits está entre 1,110₂ e 1,111₂. O que o arredondamento para o mais próximo com desempate para o par seleciona?
  1. 1,111₂
  2. 1,101₂
  3. 1,110₂
  4. 10,000₂
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Um resultado normalizado mantém o significando 1,011₂ com guarda/arredondamento/aderência 100. Qual é o significando arredondado para o mais próximo com desempate para o par?
  1. 1,011₂
  2. 1,100₂
  3. 1,010₂
  4. 1,101₂
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Usando significandos de quatro bits e arredondamento para o mais próximo com desempate para o par, quanto é 2,75 + 0,375?
  1. 3,125
  2. 3,25
  3. 2,75
  4. 3,0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Qual fração irredutível tem uma expansão binária finita exata: 7/16, 7/20, 7/12 ou 7/10?
  1. 7/16
  2. 7/20
  3. 7/12
  4. 7/10
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Um resultado normalizado com significando de quatro bits tem bits exatos 1,111101₂ no expoente real 5. No arredondamento para o mais próximo com desempate para o par, qual resultado normalizado é armazenado?
  1. 1,111₂ × 2⁵
  2. 1,000₂ × 2⁶
  3. 1,000₂ × 2⁵
  4. 1,111₂ × 2⁶
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Em binary32, no arredondamento para o mais próximo com desempate para o par, um acumulador armazenado é igual a 2²⁶. Um laço soma o valor armazenado 3 exatamente quatro vezes, arredondando após cada adição. Qual valor final resulta?
  1. 2²⁶ + 8
  2. 2²⁶ + 12
  3. 2²⁶
  4. 2²⁶ + 16
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Em aritmética binary32 com arredondamento para o mais próximo e desempate para o par, considere a = 1 + 2⁻¹², b = 1 − 2⁻¹², c = −1. O que retornam a × b + c com operações separadas e a multiplicação e adição fundidas?
  1. Ambas retornam −2⁻²⁴
  2. Separadas retornam 0; fundidas retornam −2⁻²⁴
  3. Separadas retornam −2⁻²⁴; fundidas retornam 0
  4. Ambas retornam 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um valor binary32 positivo finito estoura quando multiplicado por 2. Com roundTowardNegative, quais resultado e indicadores surgem no tratamento padrão?
  1. Infinito positivo; estouro e resultado inexato
  2. Maior positivo finito; subfluxo e resultado inexato
  3. Infinito positivo; divisão por zero e resultado inexato
  4. Maior positivo finito; estouro e resultado inexato
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Em aritmética binary32 com arredondamento para o mais próximo e desempate para o par, x = 1 + 2⁻²³ é armazenado exatamente. Um programa calcula (x − 1) × 2²³. Qual resultado ocorre e a subtração introduz erro?
  1. 1; a subtração é exata
  2. 0; a subtração descarta 2⁻²³
  3. 1; a subtração arredonda para cima
  4. 2; a subtração resulta em 2⁻²²
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Um valor exato negativo −2,3 é arredondado para um inteiro. Quais são os resultados em direção a zero e em direção ao infinito negativo?
  1. Em direção a zero −3; ao negativo −2
  2. Em direção a zero −2; ao negativo −2
  3. Em direção a zero −2; ao negativo −3
  4. Em direção a zero −3; ao negativo −3
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 6: Diagnosticar operações aritméticas no caminho de dados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Um cálculo de ponto flutuante retorna NaN. Que tipo de teste um programa deve usar para reconhecê-lo?
  1. Igualdade com uma constante NaN armazenada
  2. Um teste específico de NaN, como isnan
  3. Um teste de que o valor é igual a si mesmo
  4. Um teste de que o bit de sinal é igual a 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma ULA de 8 bits subtrai b = 0111 1000 de a = 1000 1010. Quais são os resultados de menor que com e sem sinal e a saída Zero?
  1. Com sinal 0; sem sinal 0; Zero 0
  2. Com sinal 1; sem sinal 1; Zero 0
  3. Com sinal 0; sem sinal 1; Zero 1
  4. Com sinal 1; sem sinal 0; Zero 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Um bloco de 4 bits com propagação por OR soma 1010 e 0101 com vai-um de entrada 1. O bit menos significativo do segundo operando muda de 1 para 0. O que acontece com o vai-um final e a soma?
  1. Vai-um permanece 1; soma muda de 0000 para 1111
  2. Vai-um muda de 1 para 0; soma muda de 1111 para 0000
  3. Vai-um muda de 1 para 0; soma muda de 0000 para 1111
  4. Vai-um permanece 0; soma muda de 0000 para 1111
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Um programa multiplica os padrões sem sinal de 8 bits 0xFE e 0x02. Ele toma o byte mais significativo do produto com sinal e o byte menos significativo do produto sem sinal. Qual valor de 16 bits é montado?
  1. 0xFFFC em vez de 0x01FC
  2. 0x01FC em vez de 0xFFFC
  3. 0xFF02 em vez de 0x01FC
  4. 0x00FC em vez de 0x01FC
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma rotina RV32 calcula divu e remu para dividendo 37 e divisor 0 e depois testa se q × divisor + resto é igual a 37 usando aritmética que dá a volta. O que o teste estabelece?
  1. Ele falha porque todos os bits do quociente estão ativados
  2. Ele gera uma armadilha antes de testar a igualdade
  3. Ele passa porque o quociente é zero
  4. Ele passa apesar de ter ocorrido divisão por zero
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

No intervalo normal binary32 de 64 até 128, sem incluí-lo, qual é o espaçamento entre valores adjacentes?
  1. 2⁻¹⁶
  2. 2⁻¹⁷
  3. 2⁻²³
  4. 2⁻¹⁸
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Em aritmética binary32 com arredondamento para o mais próximo e desempate para o par, a = 1 + 2⁻²², b = 1 − 2⁻²² e c = −1 são entradas exatas. O que retornam a multiplicação e a adição separadas e a FMA?
  1. Separadas: 0; FMA: −2⁻⁴⁴
  2. Separadas: −2⁻⁴⁴; FMA: −2⁻⁴⁴
  3. Separadas: 0; FMA: +2⁻⁴⁴
  4. Separadas: −2⁻²²; FMA: −2⁻⁴⁴
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um modelo com significando de quatro bits arredonda cada operação para o mais próximo com desempate para o par. Ele calcula (16 + 1,25) − 16. Qual resultado é retornado?
  1. 0
  2. 1,25
  3. 2
  4. 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um inteiro largo 67.108.867 é convertido para binary32 e de volta para um inteiro largo, com arredondamento para o mais próximo e desempate para o par. O programa então subtrai o inteiro original. Qual diferença resulta?
  1. +5
  2. −3
  3. 0
  4. −1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Após uma adição sem sinal em RV32, a soma armazenada é menor que a primeira entrada na ordenação sem sinal. Qual conclusão decorre disso?
  1. A adição necessariamente estourou com sinal
  2. A adição não tem vai-um nem estouro
  3. A primeira entrada era necessariamente negativa
  4. A adição deu a volta além do máximo sem sinal
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

78 Termos-Chave, cada um com sua definição

A

Absorção
A absorção ocorre quando somar um valor pequeno deixa um operando maior de ponto flutuante inalterado porque o arredondamento elimina a contribuição.
Um contador binary32 em 2²⁴ pode parar de aumentar quando o programa soma 1 repetidamente.
Acumulador
Um acumulador guarda um resultado aritmético acumulado; o algoritmo de Booth usa um acumulador de n + 1 bits para operandos de n bits.
O bit extra do acumulador permite subtrair um multiplicando com o valor mais negativo sem estouro.
Alinhamento dos significandos
O alinhamento desloca à direita o significando de menor expoente para que operandos de ponto flutuante compartilhem o maior expoente antes da adição ou subtração.
Alinhar expoentes 6 e 2 desloca o segundo significando quatro posições à direita.
Antecipação de vai-um
A antecipação de vai-um calcula sinais de vai-um a partir de expressões de geração e propagação, reduzindo a dependência sequencial de vai-um de um somador com propagação.
Uma unidade de antecipação pode calcular o vai-um de saída de um bloco antes que cada vai-um interno tenha se propagado.
Aritmética de saturação
A aritmética de saturação limita um resultado fora do intervalo ao maior ou ao menor valor permitido pelo formato de destino.
A soma de saturação 240 + 30 sem sinal em 8 bits retorna 255, impedindo que um pixel claro dê a volta para um valor escuro.
Aritmética modular
A aritmética modular mantém o resto após a divisão por um módulo fixo; a aritmética de n bits que dá a volta usa módulo 2ⁿ.
A soma 250 + 20 sem sinal em 8 bits retorna 14 porque 270 e 14 diferem por um módulo completo de 256.
Armadilha (trap)
Uma armadilha transfere o controle para um código de tratamento de exceção quando uma instrução aciona uma condição que exige processamento especial.
Uma adição MIPS com armadilha transfere o controle quando seu resultado com sinal excede o intervalo do registrador.
Arredondamento correto
O arredondamento correto retorna a operação matemática exata arredondada conforme o formato de destino e a direção de arredondamento selecionada.
Operações aritméticas básicas em conformidade concordam numericamente para entradas, formato de destino e direção de arredondamento idênticos.
Arredondamento direcionado
O arredondamento direcionado seleciona um vizinho representável em uma direção especificada: em direção ao infinito positivo, ao infinito negativo ou a zero.
Para um resultado negativo inexato, o arredondamento em direção a zero e o arredondamento em direção ao negativo podem escolher vizinhos diferentes.
Arredondamento para o mais próximo com desempate para o par
O arredondamento para o mais próximo com desempate para o par escolhe o valor representável mais próximo e, em um caso exatamente na metade, escolhe um significando mantido que termina em 0.
Em um empate entre inteiros, 6,5 é arredondado para 6 e 7,5 para 8 segundo essa regra.
Atribuição se menor
A atribuição se menor produz o inteiro 1 na largura completa se uma comparação especificada entre operandos for verdadeira e o inteiro 0 caso contrário.
A instrução slt do RISC-V compara operandos com sinal, enquanto sltu aplica ordenação sem sinal aos mesmos padrões.

Á

Árvore de Wallace
Uma árvore de Wallace reduz linhas de produtos parciais por camadas de compressão com salvamento de vai-um antes que uma adição final produza o produto.
A redução paralela de linhas encurta o caminho em comparação com somar um produto parcial completo após o outro.

B

bfloat16
bfloat16 é um formato de ponto flutuante de 16 bits com um bit de sinal, oito bits de expoente e sete bits de fração, priorizando intervalo em vez de precisão.
Sua largura de expoente é igual à de binary32, enquanto sua fração mais curta preserva muito menos detalhes.
Bit de aderência
O bit de aderência é o OR de todos os bits descartados além dos bits de guarda e de arredondamento, registrando se existe algum bit diferente de zero nessa parte.
Guarda 1, arredondamento 0 e aderência 1 significam acima da metade, portanto tratar o resultado como empate estaria errado.
Bit de arredondamento
O bit de arredondamento é o segundo bit extra além do significando mantido e contribui com informações sobre a parte descartada.
Guarda 1 e arredondamento 1 indicam um valor acima da metade mesmo antes de examinar o bit de aderência.
Bit de guarda
O bit de guarda é o primeiro bit extra além do significando mantido, ajudando a distinguir valores abaixo, exatamente na metade ou acima dela.
Um bit de guarda igual a 0 coloca a parte descartada abaixo de meia ulp após a normalização.
Bit oculto
O bit oculto é o 1 inicial implícito de um significando binário normal, que o formato fornece sem armazená-lo.
binary32 obtém 24 bits de precisão normal de um campo de fração de 23 bits e de seu 1 inicial oculto.
Bnegate
Bnegate é um controle compartilhado em uma ULA segmentada em fatias que inverte o segundo operando e define o vai-um de entrada inicial para subtração.
Ativar Bnegate enquanto o somador é selecionado muda a + b para a + NOT(b) + 1.

C

Campo de fração
O campo de fração armazena os bits do significando após sua vírgula binária, deixando o bit inicial implícito em valores normais.
Um significando normal de 1,01₂ armazena uma fração começando com 01, seguida de zeros para preencher o campo.
Cancelamento
O cancelamento remove algarismos iniciais comuns quando valores quase iguais são subtraídos, tornando grandes os erros anteriores dos operandos em relação à diferença.
Uma subtração exata ainda pode revelar um resultado relativo ruim se suas duas entradas já tiverem sido arredondadas.
Comparação sem sinal
Uma comparação sem sinal ordena padrões como valores binários não negativos, de modo que um bit inicial mais significativo contribui com peso positivo.
O padrão 1111 é maior que 0001 sem sinal, embora seus valores com sinal sejam −1 e 1.

D

Deslocador de barril
Um deslocador de barril combina estágios de deslocamento por potências de dois para deslocar uma palavra por uma distância selecionada em um número fixo de níveis lógicos.
Um deslocador de barril de 32 bits seleciona os estágios de 16 e 4 posições para produzir um deslocamento de 20.
Deslocamento aritmético à direita
Um deslocamento aritmético à direita move bits para posições inferiores enquanto copia o bit de sinal original para as novas posições mais significativas.
Deslocar −10 com sinal uma posição à direita produz −5; deslocar −9 da mesma forma também produz −5.
Dividendo
Um dividendo é o valor que está sendo dividido, igual ao quociente vezes o divisor mais o resto.
Em −17 dividido por 5 com truncamento, o dividendo é −17, o quociente é −3 e o resto é −2.
Divisão com restauração
A divisão com restauração tenta uma subtração do divisor e a desfaz quando a tentativa falha, produzindo um bit de quociente por etapa.
Se uma tentativa precisa de empréstimo, o hardware soma o divisor de volta e registra o bit de quociente 0.
Divisão sem restauração
A divisão sem restauração leva um resto parcial negativo para a próxima etapa e corrige o resultado na próxima adição ou em uma soma de volta final.
Um resto parcial final negativo deve ser aumentado pelo divisor para obter o resto final.
Divisão SRT
A divisão SRT seleciona dígitos de quociente a partir dos bits iniciais do divisor e do resto parcial, permitindo vários bits de quociente por etapa.
Uma entrada errada na tabela de seleção pode corromper um quociente apesar de o restante do hardware aritmético estar correto.
Divisor
Um divisor é o valor pelo qual um dividendo é dividido; na divisão inteira comum, ele deve ser diferente de zero.
Dividir 29 por 6 deixa um resto menor que o divisor positivo 6.

E

Empréstimo
Um empréstimo indica que uma subtração sem sinal precisa de uma unidade de uma posição superior porque o primeiro operando é menor que o segundo.
Subtrair 12 de 5 sem sinal precisa de empréstimo, embora o circuito ainda retorne um padrão de largura fixa.
Erro de representação
O erro de representação é a diferença entre um valor pretendido e sua aproximação armazenada quando o formato não pode representá-lo exatamente.
O valor decimal 0,1 tem expansão binária periódica e deve ser aproximado em binary32.
Estouro com sinal
O estouro com sinal ocorre quando o resultado exato fica fora do intervalo em complemento de dois do destino, independentemente do vai-um de saída.
Uma soma positiva de 8 bits que se torna um padrão negativo armazenado pode indicar estouro com sinal.
Estouro sem sinal
O estouro sem sinal ocorre quando um resultado exato fica fora do intervalo de zero ao maior valor representável na largura do destino.
Uma soma sem sinal de 8 bits de 230 e 40 armazena 14, enquanto o vai-um de saída informa que 270 não coube.
Exceção de resultado inexato
A exceção de resultado inexato registra que um resultado de ponto flutuante fornecido difere do resultado matemático exato devido ao arredondamento.
Um valor arredondado pode ativar o indicador de resultado inexato durante um cálculo comum sem produzir estouro ou operação inválida.
Exceção de subfluxo (underflow)
A exceção de subfluxo no tratamento padrão exige um resultado minúsculo e inexato, portanto um subnormal exato não a aciona.
Dividir o menor valor normal binary32 por 2 produz um subnormal exato sem subfluxo.
Extensão com zeros
A extensão com zeros amplia um padrão sem sinal inserindo zeros nas novas posições mais significativas sem alterar seu valor numérico.
Um byte sem sinal contendo 250 torna-se 0000 0000 1111 1010 quando estendido para 16 bits.
Extensão de sinal
A extensão de sinal amplia um padrão em complemento de dois copiando seu bit de sinal para as novas posições mais significativas, preservando seu valor.
Estender 1010 com sinal para 1111 1010 preserva −6; inserir zeros produziria 10 positivo.

É

Épsilon de máquina
O épsilon de máquina comumente designa o intervalo entre 1 e o próximo valor representável maior, igual a 2⁻²³ para binary32.
O intervalo logo acima de 1 é o dobro do limite relativo usual de arredondamento para o mais próximo em binary32, 2⁻²⁴.

F

Fatia de bit (bit slice)
Uma fatia de bit é a parte de um circuito repetido do caminho de dados que trata uma posição de bit dos operandos e seus sinais locais.
A fatia mais significativa fornece informações de estouro, enquanto cada fatia intermediária passa um vai-um adiante.

I

Indicador de condição
Um indicador de condição é um bit de estado do processador que registra uma propriedade de uma operação concluída para ser testada depois por outra instrução.
Um desvio pode examinar o indicador de estouro do x86 após uma adição para detectar um resultado com sinal fora do intervalo.
Infinito
Um infinito é um valor especial de ponto flutuante com sinal codificado com todos os bits do expoente ativados e fração zero.
Infinito positivo mais um valor finito permanece infinito positivo, enquanto infinito menos ele mesmo produz NaN.

L

Latência da multiplicação
A latência da multiplicação é o tempo entre o início de uma multiplicação e a disponibilização de seu resultado para uma operação dependente.
Um multiplicador segmentado em pipeline pode aceitar um novo produto a cada ciclo mesmo quando a latência é de vários ciclos.

M

Metade mais significativa do produto
A metade mais significativa do produto contém os n bits mais significativos de um produto completo de 2n bits de dois operandos de n bits.
Uma metade mais significativa diferente de zero mostra que um produto sem sinal perde informação quando armazenado em apenas n bits.
Multiplexador
Um multiplexador seleciona um entre vários sinais de entrada candidatos e o encaminha a uma saída conforme os bits de controle.
Um multiplexador de saída da ULA pode selecionar um resultado AND enquanto o somador calcula uma soma simultaneamente.
Multiplicação e adição fundidas
Uma multiplicação e adição fundidas calcula um produto mais uma parcela com um único arredondamento final, mantendo a precisão intermediária do produto.
A FMA pode preservar uma pequena diferença apagada quando um produto é arredondado antes de uma parcela de sinal oposto ser somada.
Multiplicação por deslocamentos e somas
A multiplicação por deslocamentos e somas examina sequencialmente os bits do multiplicador e acumula os valores deslocados correspondentes do multiplicando.
Um multiplicador sequencial de seis bits realiza seis etapas de bits mesmo quando a maioria dos bits do multiplicador é zero.
Multiplicador
Um multiplicador é o operando cujos bits selecionam contribuições deslocadas do multiplicando em um algoritmo de multiplicação binária.
O padrão de multiplicador 1001 seleciona uma cópia sem deslocamento e uma cópia deslocada três posições à esquerda.
Multiplicando
Um multiplicando é o operando cujas cópias deslocadas formam produtos parciais selecionados pelos bits do multiplicador.
Na multiplicação de 9 por 5 por deslocamentos e somas, cópias deslocadas de 9 contribuem nos bits 0 e 2 do multiplicador.

N

Não associatividade
A não associatividade significa que mudar o agrupamento de uma operação pode alterar seu resultado; o arredondamento intermediário a causa na adição em ponto flutuante.
Uma soma paralela pode mudar seus últimos bits quando uma quantidade diferente de threads altera o agrupamento da redução.
Não é um número (NaN)
Um NaN é um valor especial não ordenado de ponto flutuante que representa um resultado numérico indefinido, codificado com fração diferente de zero e todos os bits do expoente ativados.
Zero dividido por zero produz NaN, e comparar esse resultado consigo mesmo para verificar igualdade retorna falso.
Normalização
A normalização move um significando diferente de zero para a forma exigida de algarismo inicial e altera o expoente para preservar seu valor.
Uma soma com significando 10,1₂ é deslocada uma posição à direita enquanto seu expoente aumenta em um.
Número subnormal
Um número subnormal é um valor de ponto flutuante diferente de zero com campo de expoente zero, significando com 0 inicial e a escala normal mínima.
O padrão binary32 0x00000002 representa o dobro do menor subnormal positivo.

P

Precisão
A precisão é o número de algarismos significativos disponíveis em um formato numérico, limitando o detalhe em uma determinada escala.
Aumentar o expoente pode aumentar o espaçamento binary32 mesmo que sua precisão de 24 bits permaneça fixa.
Produto parcial
Um produto parcial é uma contribuição deslocada para um resultado de multiplicação, selecionada por um bit do multiplicador ou por um dígito recodificado.
Na multiplicação binária sem sinal, cada produto parcial comum é um multiplicando deslocado ou zero.

Q

Quociente
Um quociente é o resultado da divisão antes do resto; a divisão inteira com sinal por truncamento o arredonda em direção a zero.
Para −19 dividido por 4, o truncamento fornece quociente −4, enquanto o arredondamento para baixo forneceria −5.

R

Recodificação de Booth
A recodificação de Booth substitui sequências de bits do multiplicador por contribuições com sinal, permitindo multiplicar por meio de adições e subtrações.
Um multiplicador com uma longa sequência de bits iguais a 1 pode ser representado por uma potência de dois menos outra potência de dois.
Recodificação de Booth de base 4
A recodificação de Booth de base 4 trata dois bits do multiplicador por etapa com dígitos com sinal de −2 a +2 para reduzir a quantidade de produtos parciais.
Um multiplicador de base 4 precisa de menos linhas de produtos parciais que um projeto que cria uma linha por bit do multiplicador.
Registrador de ponto flutuante
Um registrador de ponto flutuante guarda um operando ou resultado de instruções de ponto flutuante; as extensões F e D do RISC-V usam os registradores de f0 a f31.
Uma comparação de ponto flutuante grava seu resultado de 0 ou 1 em um registrador de inteiros em vez de nesse banco.
Resto
Um resto é o valor que sobra após subtrair do dividendo o produto do quociente pelo divisor, conforme a convenção de divisão escolhida.
A instrução rem do RISC-V fornece −2 para −17 dividido por 5 porque o resto diferente de zero segue o sinal do dividendo.

S

Saída Zero
A saída Zero é um sinal de estado da ULA que é 1 somente quando todos os bits do resultado são zero, geralmente formado por uma redução NOR.
Subtrair padrões de operandos iguais ativa Zero mesmo quando esses padrões representam valores negativos com sinal.
Significando (mantissa)
Um significando contém os algarismos binários significativos de um valor de ponto flutuante, incluindo o bit inicial implícito quando o valor é normal.
O valor normal 1,101₂ × 2³ tem significando 1,101₂ e expoente real 3.
Sinal corrigido pelo estouro
O sinal corrigido pelo estouro é o sinal do resultado da subtração em XOR com o estouro com sinal, fornecendo a decisão correta de menor que com sinal.
Uma diferença real positiva que deu a volta pode parecer negativa até que o bit de estouro corrija a comparação.
Sinal de geração de vai-um
Um sinal de geração de vai-um indica que uma posição de bit produz um vai-um independentemente do vai-um de entrada porque ambos os bits dos operandos são 1.
Quando geração é 1, o próximo vai-um é 1 mesmo que nenhuma posição inferior tenha fornecido um vai-um de entrada.
Sinal de geração de vai-um do grupo
Um sinal de geração de vai-um do grupo indica que um bloco de bits produz um vai-um de saída independentemente do vai-um que entra no bloco.
Um bit mais significativo que gera um vai-um faz o bloco gerar, mesmo que seu bit menos significativo interrompa sinais de vai-um de entrada.
Sinal de propagação de vai-um
Um sinal de propagação de vai-um descreve se um vai-um de entrada pode atravessar uma posição de bit; este projeto usa o OR dos operandos.
Com entradas 1 e 0, propagação é 1 e geração é 0, portanto o vai-um de entrada determina o vai-um de saída.
Sinal de propagação de vai-um do grupo
Um sinal de propagação de vai-um do grupo indica que cada posição de um bloco pode passar um vai-um de entrada até a saída do bloco.
Os quatro bits de propagação por OR devem ser todos 1 para que a propagação de grupo de um bloco de quatro bits seja 1.
Somador com propagação de vai-um
Um somador com propagação de vai-um encadeia somadores completos de modo que cada vai-um de saída forneça o vai-um de entrada do próximo bit mais significativo.
Um vai-um criado no bit 0 pode precisar passar por muitas fatias antes que o bit de resultado mais significativo se estabilize.
Somador com salvamento de vai-um
Um somador com salvamento de vai-um comprime três palavras de entrada em uma palavra de soma e uma palavra de vai-um sem propagar sinais de vai-um por toda a largura.
Vários níveis de salvamento de vai-um reduzem linhas de produtos parciais antes de uma adição final com propagação de vai-um.
Somador com seleção de vai-um
Um somador com seleção de vai-um calcula um bloco para os dois possíveis sinais de vai-um de entrada e seleciona um resultado pré-calculado quando o vai-um chega.
Duplicar a aritmética do bloco mais significativo troca mais área de circuito por uma espera menor pelo bloco menos significativo.
Somador completo
Um somador completo combina dois bits de operandos e um vai-um de entrada, produzindo um bit de soma e um vai-um de saída para a posição seguinte.
Com três entradas iguais a 1, o somador completo produz soma 1 e vai-um 1, representando o valor binário 11.
Subfluxo gradual
O subfluxo gradual representa valores minúsculos com precisão significativa decrescente por meio de subnormais, em vez de substituí-los imediatamente por zero.
A metade exata do menor valor normal binary32 permanece como um subnormal diferente de zero.
Subtração em complemento de dois
A subtração em complemento de dois soma ao primeiro operando o segundo operando invertido e um vai-um inicial de 1.
O mesmo somador de 8 bits pode calcular 19 + 6 ou 19 − 6 mudando seus controles de inversão e de vai-um.

T

Tolerância absoluta
Uma tolerância absoluta define uma margem de erro independente do módulo, útil quando valores finitos aproximados estão próximos de zero.
Um limite absoluto mínimo impede que uma comparação próxima de zero dependa apenas de uma margem relativa que tende a zero.
Tolerância relativa
Uma tolerância relativa define um erro de comparação aceitável proporcional aos módulos dos valores finitos comparados.
Uma tolerância relativa fixa permite uma diferença absoluta maior para valores próximos de um milhão que para valores próximos de um.

U

Unidade lógica e aritmética
Uma unidade lógica e aritmética é um circuito combinacional do caminho de dados que seleciona resultados aritméticos ou lógicos a partir de operandos e entradas de controle.
Mudar os controles de operação permite que o mesmo par de saídas de registradores alimente uma adição ou um AND bit a bit.
Unidade na última posição
Uma unidade na última posição, ou ulp, é o espaçamento associado à posição menos significativa mantida em uma escala escolhida.
No intervalo binary32 de 16 a 32, valores normais adjacentes estão separados por 2⁻¹⁹.

V

Verificação de limites
Uma verificação de limites testa se um índice pertence ao intervalo válido de um vetor antes que ele seja usado para acessar um elemento.
Uma comparação sem sinal com um comprimento não negativo dentro do intervalo com sinal rejeita índices negativos e excessivos.
Viés do expoente
Um viés do expoente é um deslocamento fixo somado ao expoente real de um número normal antes de armazená-lo como campo sem sinal.
Um expoente real binary32 de 5 é armazenado como 132 porque o viés do formato é 127.

Z

Zero com sinal
Um zero com sinal é um zero de ponto flutuante com bit de sinal positivo ou negativo; os dois são iguais na comparação, mas mantêm alguns efeitos do sinal.
1 positivo dividido por zero negativo retorna infinito negativo no tratamento padrão de ponto flutuante.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar