Vous êtes sur la page 1sur 30

Aritmtica de Ponto Flutuante

Formato Padro IEEE 32 bits, Sinal, Expoente e Mantissa, Normalizao, Converso, Unidade de Ponto Flutuante Intel (FPU), Registradores e Instrues associados FPU Orlando Figueiredo, Rio Claro, Maio de 2006

Nmeros Reais e Computao

Nmeros reais so difceis de representar computacionalmente


Podem ser muito extensos Podem ser infinitos


Dzimas peridicas Nmeros irracionais

inevitvel trunc-los

Nmeros Reais e Computao

Desde os primrdios da computao duas abordagem prevaleceram

Ponto fixo

O separador da parte inteira e da parte fracionria (ponto nos EUA, vrgula no Brasil) permanece numa mesma casa Similar notao cientfica O separador varia de casa, conforme o expoente da potncia associada

Ponto flutuante

7,02 x 102 (na centena)

70,2 x 101 (na dezena)

0,702 x 103 (no milhar)

O Formato de Ponto Flutuante


Em geral, a base da potncia 2 Trs partes:


Sinal Expoente Mantissa


1101

Exemplo: (101,11 x 10

)2

Expoente: 1101 Mantissa: 101,11

Os Formatos do Padro IEEE

Short Real : 32 bits


Sinal: 1 bit Expoente: 8 bits Mantissa: 23 bits Sinal: 1 bit Expoente: 11 bits Mantissa: 52 bits

31 30 23 22 0 1 11111111 11111111111111111111111

Long Real : 64 bits


Nmeros Binrios Fracionrios


A mantissa um nmero binrio fracionrio O valor de uma casa metade do valor da casa vizinha esquerda Esquematicamente
__ __ __ __ , __ __ __ __ __ 8 4 2 1 23 22 21 20 2-1 2-2 2-3 2-4 2-5 __ 2-6 __ ... 2-7 1/8 1/16 1/32 1/64 1/128

Nmeros Binrios Fracionrios

Quanto vale 0,1 binrio em decimal?

R: Metade de 1,0 (= ) R: Metade de 0,1 (= ) R: 0,11 = 0,1 + 0,01 = + = R: 2 + 1 + + 0/4 + 1/8 + 1/16 = 3,6875

Quanto vale 0,01 binrio em decimal?

Quanto vale 0,11 binrio em decimal?

Quanto vale 11,1011?

Expoente

O expoente no Padro IEEE deslocado de +127 unidades


Expoente +5 -10 +128 -127 Ajustado 132 117 255 0 Em binrio 10000100 01110101 11111111 00000000

Normalizao da Mantissa

O separador deve ficar imediatamente aps o primeiro algarismo significativo Normalizado 1,101101 1,01 1,0001 1,0000011 Expoente 3 -3 0 7

Valor Binrio 1101,101 0,00101 1,0001 10000011,0

Empacotamento Final

A mantissa sempre normalizada, logo o bit mais significativo sempre 1 e, por isso, no precisa ser armazenado

Valor
-1,11 +1101,101 -0,00101

Expoente Sinal, Expoente, Mantissa


127 130 124 1 01111111 11000000000000000000000 0 10000010 10110100000000000000000 1 01111100 01000000000000000000000

Exerccios:
-100111,0 +0,0000001101011

Dzimas Peridicas Binrias

Como fica 1/5 em codificao binria:

R: 0,001100110011001100110011001100110011...

Unidade de Ponto Flutuante

As operaes aritmticas sobre nmeros representados em ponto flutuante so muito onerosas Foi preciso implement-las por hardware para melhorar o desempenho geral dos computadores Originalmente, esse hardware era chamado coprocessador aritmtico e era vendido separadamente

8087 (para o 8086), ..., 80387 (para o 386)

Posteriormente, ele foi incorporado em definitivo ao processador principal e passou a ser chamado de FPU

Isso aconteceu a partir do 486

Registradores da FPU

8 registradores de 80 bits So organizados como uma pilha circular


O topo da pilha o ST(0), ou ST Os demais so ST(1), ST(2), ..., ST(7)

H outros registradores de propsito geral

Instrues

Todas comeam com F de floating

Exemplos: FADD FLD FST FMUL FINIT FSUBR FDIV FDIVR FADDP etc

Instrues de Movimentao de Dados

FLD src

LD um mnemnico para LoaD (carregar) Escreve um valor no topo da pilha FPU O valor est em src, que deve ser obrigatoriamente uma posio de memria

No valem registradores da CPU ou constantes

como se fosse um push para a pilha da FPU

Instrues de Movimentao de Dados

FST dest

ST um mnemnico para STore (armazenar) L o valor no topo da pilha FPU O valor copiado para dest, que deve ser obrigatoriamente uma posio de memria

No valem registradores da CPU ou constantes

No apaga o valor no topo da pilha, por isso, no funciona como um pop

Instrues Aritmticas

FADD

Adio Subtrao Multiplicao Diviso

FSUB

FMUL

FDIV

Instrues Aritmticas Sem Operandos

A forma mais simples de funcionamento de uma instruo aritmtica no envolve operandos

Ex: fadd

Nesse caso, a operao feita sobre os dois registradores que esto no topo da pilha, ST(0) e ST(1)

Tudo se passa como se os dois fossem retirados da pilha para a realizao da operao e o resultado fosse colocado na pilha ao final

ST(1) o destino e ST(0), a fonte

Instrues Aritmticas Sem Operandos


ST(0) ST(1) ST(2) ST(3) 4.0 3.0 0.6 0.0 ... fsub ST(7) 4.0 ST(0) -1.0 ST(1) ST(2) 0.6 0.0 ...

ST(0) e ST(1) so removidos da pilha. 0.6 passa a ser o ST(0). Faz-se a conta 3.0-4.0, que resulta em -1.0. O resultado colocado na pilha e passa a ser o novo ST(0). A pilha circular. Abaixo de ST(0) est ST(1) e assim sucessivamente. Abaixo de ST(7), est ST(o). medida que ST(0) avana ou recua, todo o conjunto vai junto.

Instrues Aritmticas Sem Operandos

Lembra a utilizao de uma calculadora RPN

.data dois REAL4 2.0 base REAL4 ? ;a ser lida alt .code ;Aps a entrada de dados: fld base fld alt fmul fld dois fdiv REAL4 ? ;idem

Para calcular (1+7) x 6, digita-se:


1 7 + 6 * ou 617+*

Ao lado, programa para calcular a rea de um tringulo

Instrues Aritmticas Com Um Operando

As instrues aritmticas podem ser utilizadas com um operando que corresponde a uma posio da memria Nesse caso, a operao realizada entre o operando e o ST(0), sendo ele o destino

.data dois REAL4 2.0 base REAL4 ? ;a ser lida alt .code ;Aps a entrada de dados: fld base mul alt ;ST<- ST * alt fdiv dois ;ST<- ST / 2 REAL4 ? ;idem

Operaes Aritmticas Com Dois Operandos

Um dos operandos deve ser obrigatoriamente o ST (=ST(0)) Exemplos:


fadd st, st(3) fmul st(2),st

Invertendo a Ordem da Subtrao e da Diviso

FSUBR

O R de reversa Sem operandos: calcula ST - ST(1) Com um operando: calcula operando ST Com dois operandos: calcula op2 op1 Sem operandos: calcula ST / ST(1) Com um operando: calcula operando / ST Com dois operandos: calcula op2 / op1

FDIVR

Trabalhando com Operandos Inteiros

Todas as instrues mostradas anteriormente requerem que os operandos que estejam na memria estejam no formato de ponto flutuante possvel trabalhar com variveis inteiras

A converso feita automaticamente Se o dado na memria levado para a FPU durante a operao, converte-se o dado de inteiro para ponto flutuante Se o dado levado da FPU para a memria, converte-se o dado de ponto flutuante para inteiro

Trabalhando com Operadores Inteiros

Denotam-se as operaes com operandos inteiros adicionando-se um I depois do F que inicia o mnemnico da operao Exemplos:

FILD

FIADD

FISUBR

Extra POP

Existe a opo de se apagar o resultado da operao da pilha imediamente aps a operao Isso conhecido como extra POP Denota-se o extra POP adicionando-se a letra P no final do mnemnico Exemplos:

FADDP FSTP FIDIVRP

A instruo FSTP , portanto, similar a um POP da pilha

Carregando Constantes

Existem instrues especiais para carregar constantes muito usadas


fldz fld1 fldpi fldl2t fldl2e fldlg2 fldln2 Pe +0,0 na pilha da FPU Pe +1,0 na pilha da FPU Pe na pilha da FPU Pe log210 na pilha da FPU Pe log2e na pilha da FPU Pe log102 na pilha da FPU Pe loge2 na pilha da FPU

Mais Instrues

finit

Inicializa a FPU Inverte o sinal de ST Comparao Resultado nos flags C0, C1 e C2 da FPU

fchs

fcom

Programa Exemplo Volume da Esfera


.data quat REAL4 4 tres REAL4 3 raio REAL4 34.5 vol REAL4 ? .code main PROC finit fld raio fmul raio fmul raio fmul quat fdiv 3 fstp vol exit main ENDP

Referncias

KNUTH, DONALD E. The Art Of Computing Programming. V.2, p.198-213

Apresenta os algoritmos para adio (subtrao), normalizao e multiplicao (diviso)

IRVINE, KIP. 4.ed. Captulo 17, no CD. DANDAMUDI, SIVARANA. Introduction to Assembly Language Programming. 2.ed. Springer, 2005. Captulo 17.

Apresentao disponvel no site do autor; discute os registradores de controle e status

Vous aimerez peut-être aussi