Sistemas de Computação - ALFAalfa.di.uminho.pt/~brunom/SC_M2.pdf · 4b 3[.]b 2b 1b 0 ! #2 o ponto...
Transcript of Sistemas de Computação - ALFAalfa.di.uminho.pt/~brunom/SC_M2.pdf · 4b 3[.]b 2b 1b 0 ! #2 o ponto...
Sistemas de Computação Práticas Laboratoriais
Semana 2
Prof. Bruno Medeiros Prof. António Pina
Números Fracionários
� Qual o decimal de 1011.1012? � Parte inteira => 1011 -> 1110
� Parte Fracionária => 101 -> 5 / 23 = 0.625
� Valor = 11.62510
� Ou seja, interpretamos da mesma forma que interpretamos um número inteiro.
Números Fracionários
� Valor: � 5 ¾
� 101.112
� 2 7/8 � 10.1112
� 63/64 � 0.1111112
Limitações da representação fracionária em binário
� Só podemos representar de forma exata valores que possam ser escritos na forma � x / 2y
� Valor : Representação:
� 1/3 0.01010101[01]2
� 1/5 0.001100110011[0011]2
� 1/10 0.0001100110011[0011]2
Cálculo da parte irracional
� Multiplicações consecutivas por 2 até achar o periódico
� Exemplo � 1/3 = 0.(3)10
� 0.(3) * 2 = 0.(6) Parte Inteira : 0
� 0.(6) * 2 = 1.(3) Parte Inteira : 1
� 0.(3) periódico
� Logo 0.(3)10 = 0.(01)2
Cálculo da parte irracional
� Exemplo � 1/5 = 0.210
� 0.2 * 2 = 0.4 Parte Inteira : 0 � 0.4 * 2 = 0.8 Parte Inteira : 0
� 0.8 * 2 = 1.6 Parte Inteira : 1 � 0.6 * 2 = 1.2 Parte Inteira : 1 � 0.2 (periódico)
� Logo 0.210 = 0.(0011)2
Representação ponto fixo
� Nesta representação fixamos o ponto binário num ponto pré-definido
� Por exemplo, usando 8 bits ponto fixo � #1 o ponto binário fica entre o bit 2 e o 3
� b7b6b5b4b3[.]b2b1b0
� #2 o ponto binário fica entre o bit 4 e o 5 � b7b6b5[.]b4b3b2b1b0
� Podemos representar até 31.625 no #1 e 7.96875 no #2
� Há um compromisso entre precisão e a gama de valores que podemos representar
Representação fixa
� Onde colocar o ponto fixo? � Irá depender da precisão e da gama que queremos
representar
� Na representação fixa existe um trade-off entre a gama de valores que se vai poder representar e a precisão dos valores � + gama implica menos precisão e vise - versa
Ponto fixo num computador � Exemplo com 8 bits
� Queremos representar reais negativos e positivos
� Utilizando � 1 bit para o sinal (vermelho)
� 3 para a parte inteira (azul)
� 4 para a parte fracionária (verde)
� Exemplo 11.11 � 00111100
Valores representáveis (exemplo)
� 0 000 0001 = 1/16
� 0 000 0010 = 2/16
� 0 000 0011 = 3/16
� ...
� 0 000 1111 = 15/16 (valor mais próximo de 1)
� 0 001 0000 = 1
� ....
0 111 1111 = 7.9375
... continuação � A distância entre dois valores consecutivos no
exemplo anterior era sempre a mesma (1/16 = 0.0625)
� Veremos mais à frente que no caso do ponto/vírgula flutuante o espaçamento não é sempre o mesmo.
Ponto Fixo
� Prós � Fácil e simples de usar
� O mesmo hardware que faz a aritmética de inteiros também é capaz de fazer a aritmética de reais
� Contras � Não existe uma boa forma de escolher onde colocar o
ponto � Ás vezes vamos querer mais precisão, outras vezes
queremos uma gama maior
Ponto Fixo vs. Vírgula flutuante (fp)
� Ponto fixo � Esta representação acaba por não ser muito usada
� O standard para a representação binária de números reais é o “Floating Point” (FP) � Permite flutuar o ponto binário da seguinte forma
� Quando queremos representar números muito pequenos pedimos bits “emprestados” à parte inteira
� Quando queremos representar números muito grandes pedimos bits “emprestados” à parte fracionária
Notação Científica
� Durante o dia à dia deparamo-nos com situações em que podemos ter que lidar com números muito grandes e/ou muito pequenos � Comprimento do diâmetro da terra
� 12 800 000 m
� A massa de uma molécula de água � 0.00 000 000 000 000 000 000 00299g
� Como se pode verificar, não é prático trabalhar com números com grandes quantidades de algarismos
� No entanto, podemos escrever tais números usando potências de 10
Notação Científica
� Molécula de água : 2.99 x 10 -23 g
� Diâmetro da terra : 1.28 x 10 7 m
� Facilita as operações aritméticas � 3 000 000 00 � x 0.000 000 15 ?
� Em notação científica � 3 x 108
� x 1.5 x 10-7
� = (3 * 1.5) * 10(8-7) = 4.5 x 101
Notação Científica
� Em notação científica um número é representado na forma � A x 10b
� Em que b é um expoente inteiro � A é um número real, chamado de significante ou
fracionário � Se o número é negativo, coloca-se um sinal à esquerda
do A � Este formato permite que o mesmo número possa
ser representado de várias formas diferentes � Por exemplo 350 pode ser representado como:
� 3.5 x 102 � 35 x 10-1
� 350 x 100
Notação Científica Normalizada
� Para facilitar a sua representação, impõe-se um formato específico � Normalizado (1 <= |A| < 10)
� No caso do 350, em notação científica normalizada ficava � 3.5 x 102 (1 <= |3| < 10)
� Esta forma facilita comparações entre números, uma vez que o expoente b dá o número de ordem de magnitude
Notação Científica Normalizada
� É mais fácil comparar
� 3.5 x 102 com 4.5 x 102
do que
� 35 x 101 com 4.5 x 102
Problema ?
� Usando 7 algarismos, 5 para mantissa e 2 para expoente
� Como representamos [0.0000E-99, 1.0000E-99 [? � Na forma normalizada estamos a desperdiçar este
intervalo
� Utilizamos a chamada Notação desnormalizada � 0.yyyy x 10exp
De notação Científica para FP
� A notação científica do tipo � Valor = (-1)s x Mantissa x Radix exp
� É das que permite a melhor representação dos números reais em vírgula flutuante
� Radix é a base � 10 no decimal, e em binário pode ser 2 ou potências
de 2, mas vamos apenas focar em 2 que é o standard atual.
� S é o sinal � S -> 0 positivo = (-1)0 = 1
� S -> 1 negativo = (-1)1 = -1
... continuação
� Mantissa será � Y.xxxx (normalizada com 1 <= Y < radix)
� 0.xxxx (desnormalizada)
Floating point � Vai nos permitir ao mesmo tempo representar
tanto valores muito grandes como muito pequenos (ao contrário do ponto fixo)
� O truque é representar o número real na sua forma científica � Ex.
� 25.7 x 10 4 = 257000
� 25.7 x 10-1 = 2.57 � 25.7 x 10-2 = 0.257
� Como podemos ver o expoente é responsável pela flutuação do ponto decimal
� No caso dos binários vai acontecer o mesmo em relação ao ponto binário
Floating point
� Para podermos representar um número real no computador no mesmo estilo da representação científica � Temos que fixar o ponto binário � E flutuamos o ponto apenas mexendo no expoente
� Iremos usar a forma normalizada � Que no caso do binário será
� 1.F x 2exp
Floating point
� Formato binário de um valor em fp usa 3 campos � Sinal, S – Ficando mais à esquerda, permitirá usar o
mesmo hardware (que trabalha com inteiros) para testar o sinal de um valor em fp
� Expoente, E – Ficando logo a seguir ao sinal � Vai permitir fazer comparações quanto à grandeza entre
valores absolutos em fp, sem a necessidade de separar os 3 campos. Basta comparar os valores como se de valores meramente binários se tratasse
� Parte Fracionária, F – É o campo mais à direita
Bit Escondido
� Sabemos que um valor normalizado tem sempre o dígito mais à esquerda diferente de zero � Se for no sistema decimal podemos ter 9 valores
diferentes � Mas no binário só temos um valor possível = 1 � Logo podemos omit i r este b i t durante a
representação interna de um fp em binário � Ganha-se um bit extra para melhorar a precisão, este
bit será usado na parte fracionária
A Norma IEEE 754 para fp
� Estabeleceu em 1985 um standard para a aritmética e representação de floating points � Antes desta norma havia diferentes formatos que
eram difíceis de combinar
� Norma suportada pela grande maioria dos CPU atuais
� Permiti portabilidade dos dados entre diferentes sistemas
Aspectos relevantes da norma IEEE 754
� Representação do sinal � bit mais à esquerda representa o sinal. 0 positivo, 1
negativo
� Parte fracionária � representamos o valor em absoluto � Utiliza-se o bit escondido
� Representação do expoente � Para facilitar o processo de comparação de valores
(sem obrigar a separar campos) o expoente deverá ser codificado da seguinte forma
Aspectos relevantes da norma IEEE 754
� Representação do expoente � Para facilitar o processo de comparação de valores
(sem obrigar a separar campos) o expoente deverá ser codificado da seguinte forma � Os valores menores do expoente (negativos) terão uma
representação binária menor do que os valores positivos (os maiores)
� Sinal e amplitude?
� Complemento para 1 ?
� Complemento para 2 ?
� Nenhum das 3 porque usam todas um 1 à esquerda para representar o sinal, o que torna os como números binários maiores do que os positivos
Representação do expoente
� Utilização do Excesso � Vai permitir que o padrão de bits todo a zeros
(00..00) seja o menor expoente, e o padrão de bits todo a 1’s (11..11) seja o maior expoente
� Este excesso é calculado por 2n-1 -1 � Sendo ‘n’ o número de bits reservado para o expoente
� Visão global do formato � [S | Expoente | Parte fracionária]
� Expoente representado em excesso
� Sendo os campos representados em binário
Norma IEEE 754
� Valor decimal de um fp em binário (normalizado) é dado por � V = (-1)s X (1.F) x 2(E – Excesso)
� Em que S, F e E representam respectivamente os valores em binário do sinal, parte fracionária e o expoente em excesso, no formato em fp
� Representação de valores desnormalizados � A norma reserva o E = 0’s e o F ≠ 0’s
� Para calcular o decimal utiliza-se a seguinte fórmula � V = (-1)S x (0.F) x 2(1-Excesso)
� O porquê de 1-Excesso? Será explicado mais à frente
Norma IEEE 754 (casos especiais)
� Representação do zero � E = 0’s e F= 0’s
� Representação do infinito � E = 1’s e F = 0’s
� Se sinal = 0 -> +00
� Se sinal = 1 -> - 00
� Representação do NaN � E = 1’s e F ≠ 0’s
� Exemplo � √-1
Norma IEEE 754
� 32 bits (vírgula flutuante de precisão simples) � 1 bit para sinal
� 8 bits para expoente � 23 bits para a parte fracionária
� Excesso = 28-1 -1 = 127
� 64 bits (vírgula flutuante de precisão dupla) � 1 bit para sinal � 11 bits para expoente � 52 bits para a parte fracionária
� Excesso = 211-1 – 1 = 1023
Exemplo Prático
� Vamos usar um exemplo com 8 bits (apenas para feitos pedagógicos) que segue as mesmas regras que a norma 574 do IEEE
� Vamos utilizar � 1 bit para sinal
� 3 bits para expoente
� 4 bits para a parte fracionária
Passar de decimal para representação binária fp
� Número : 0.5625
� 1) Converter para binário � 0.1002
� 2) Normalizar o binário � 1.0012 x 2 -1
� 3) Identificar o sinal do valor � Positivo => S = 0
� 0 _ _ _ _ _ _ _
... continuação
� 4) Representação da mantissa sem bit escondido � 0012
� 0 _ _ _ 0010
� 5) Calcular o expoente a ser gravado (E) � Calcular o Excesso : 2n-1 -1 = 22 – 1 = 3 � E = expoente + excesso = -1 + 3 = 2
� Converter E para binário 210 = 102
� 0.5625 em formato binário de fp fica � 0 010 0010
Fp para decimal
� Utilizamos a fórmula � V = (-1) S x 1.F x 2(E – excesso)
� Calcular o valor decimal de 0 010 0010 � S = 0 (bit + à esq.)
� F = 00102
� E = 0102 = 210
� Temos que retirar do expoente gravado (E) o excesso
� Uma vez que o expoente é gravado com o excesso, agora é necessário retirá-lo para fazer o processo inverso
� Expoente = 2 – 3 = -1
... continuação
� Substituímos na fórmula
� V = (-1)0 x 1.0012 x 2(2 – 3)
� = 1 x 1.0012 x 2-1
� = 1.0012 x 0.5
� = 0.5005 ??? Porque é que não deu 0.5625?
� Não podemos multiplicar o binário pelo decimal
� = 1.0012 x 2-1 = 0.10012 = 0.5625
� Ou 1.0012 x 0.510 = 1.12510 x 0.510 = 0.5625
Casos especiais
� 1 111 0000 ? � E = 1’s, F = 0’s e S = 1 => -00
� 0 111 0000 ?
� E = 1’s, F = 0’s e S = 1 => +00
� Não vale a pena tentar converter as sequencias acima porque não faz sentido. Estes padrões de bits estão reservados pela norma IEEE 754 para representar infinito
... continuação
� 0 111 0010 ? � E = 1’s e F ≠ 0’s => NaN
� Significa que o maior valor que podemos representar neste formato será ? � 0 110 1111
� Neste caso (-1)0 x (1.1111) x 2 (6-3) = 15.5
� E não pode ser 111 senão o valor seria NaN
� 0 000 0000 � E = 0’s e F = 0’s a norma diz que o valor é zero
Desnormalizados
� Maior positivo desnormalizado ? � 0 000 1111
� Menor número positivo desnormalizado? � 0 000 0001
� O porquê do Expoente ser 1 – Excesso? � Desta forma o salto entre o maior desnormalizado e o
menor normalizado positivo é o mesmo que entre dois valores desnormalizados consecutivos
FP valores � 0 000 0001 = 1/64
� 0 000 0010 = 2/64
---
� 0 000 1111 = 15/64
De notar que nos desnormalizados a distância entre dois valores consecutivos é sempre a mesma (neste caso 1/64)
� 0 001 0000 = 16/64 = 0.25 (normalizados)
� 0 001 1111 = 31/64
� 0 010 0000 = 0.5
� Parte interessante é que agora a distância entre 2 valores consecutivos dobrou. Então sempre que o expoente aumenta a distância entre dois valores aumenta
Porque deste comportamento?
� A ideia é que os valores mais próximo de zero terão mais precisão.
� Enquanto os valores mais afastados terão menos precisão, mas em compensação permitirá representar uma maior gama de valores
72 CHAPTER 2. REPRESENTINGAND MANIPULATING INFORMATION
Description Bit Rep.Zero 0 0000 000Smallest Pos. 0 0000 001
0 0000 0100 0000 011
0 0000 110Largest Denorm. 0 0000 111Smallest Norm. 0 0001 000
0 0001 001
0 0110 1100 0110 111
One 0 0111 0000 0111 0010 0111 010
0 1110 110Largest Norm. 0 1110 111Infinity 0 1111 000 – – – –
Figure 2.23: Example Nonnegative Values for eight-bit Floating-Point Format. There are expo-nent bits and significand bits. The bias is .
Sumário
Legenda: e – expoente em excesso; E – expoente; f – parte fracionária; M – mantissa (incluído o bit escondido); V – valor real; Excesso = 7; Desnormalizados : V = (-1)s x 0.F x 2(1- excesso)
Normalizados : V = (-1)s x 1.F x 2(e - excesso)
Referências
� Material de apoio do Prof. Alberto Proença - Universidade do Minho � http://gec.di .uminho.pt/lcc/sc0809/
Acetatos/RepresNum_Mar04.pdf
� Floating Point � The Basics : http://www.cs.uwm.edu/~cs151/Bacon/
Lecture/HTML/ch03s10.html
� What every computer scientist should know about Floating point Arithmetic: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Referências
� Computer System: A Programmer’s Perspective, 2/E (CS: APP2e). Randal E. Bryant and David R. O'Halloran, Carnegie Mellon University
� Introduction to Computer Systems, Randy Bryant and Dave O'Halloran