Baixe o app para aproveitar ainda mais
Prévia do material em texto
Representação em Ponto Flutuante 1 Representação em Ponto Flutuante • Aproximação de aritmética de números reais • Codifica números racionais da forma V = x * 2y – útil para computações com valores muito grandes (|V| >> 0) ou muito próximos de 0 (|V| << 1) • Padrão IEEE-754 (~1985) – representação de números de ponto flutuante e suas operações – adotado atualmente pela maioria dos fabricantes – portabilidade! 2 Números Fracionários na Base 2 • Notação decimal: – dm dm-1 ... d1 d0 d-1 d-2 ... d-n → Σ 10i * di – 12.3410 = 1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2 • Notação binária: – bm bm-1 ... b1 b0 b-1 b-2 ... b-n → Σ 2i * bi – 101.112 = 1 *22 + 0 *21 + 1 * 20 + 1 * 2-1 + 1 * 2-2 = 4 + 1 + ½ + ¼ = 5 ¾ = 5.75 m i = -n potências POSITIVAS de 10 potências NEGATIVAS de 10 3 potências POSITIVAS de 2 potências NEGATIVAS de 2 m i = -n ponto/vírgula “binário” Notação Binária – posições à direita do “ponto binário” correspondem a potências negativas de 2 – números da forma 0.111111…2 estão próximos de 1.0 4 bm bm–1 b2 b1 b0 b–1 b–2 b–3 b–n • • • • • • . 1 2 4 2m–1 2m • • • • • • 1/2 1/4 1/8 2–n Deslocamento do Ponto Binário • Deslocar o ponto para a esquerda divide o valor por 2: – 101.112 = 4 + 1+ ½ + ¼ = 5 ¾ = 5.75 – 10.1112 = 2 + ½ + ¼ + 1/8 = 2 7/8 = 2.875 = 5.75/2 • Deslocar o ponto para a direita multiplica o valor por 2: – 101.112 = 4 + 1+ ½ + ¼ = 5 ¾ = 5.75 – 1011.12 = 8 + 0 + 2 + 1 + ½ = 11 ½ = 5.75 * 2 5 Conversão binário → decimal • 1.001 = 1 * 20 + 1 * 2-3 = 1 + 1/8 = 9/8 = 1.125 • 101.111 = 1 * 22 + 1 * 20 + 1 * 2-1 + 1 * 2-2 + 1 * 2-3 = 5 + 1/2 + 1/4 + 1/8 = 5 + 7/8 = 5.875 • 11.0011 = 1 * 21 + 1 * 20 + 1 * 2-3 + 1 * 2-4 = 3 + 1/8 + 1/16 = 3 + 3/16 = 3.1875 6 Conversão decimal→ binário (1) • Idéia básica: representar um número como uma fração da forma x / 2k – encontra a representação de x e posiciona o ponto “k” casas a partir da direita • 0.125 = 0.25/2 = 0.5/4 = 1/8 = 1/ 23 → 0.0012 • 0.75 = 1.5/2 = 3/4 = 3/22 → 0.11 • 2.6875 = 5.375/2 = 10.75/4 = 21.5/8 = 43/16 = 43/24 → 10.1011 7 desloca ponto 3 casas desloca ponto 2 casas desloca ponto 4 casas Conversão decimal→ binário (2) • Parte fracionária: 0.d1d2d3 ... dm = 0.b1b2b3... bn x .d´1d´2d´3 ... d´k b1 .b2b3... bn 0.d´1d´2d´3 ... d´k = 0.b2b3... bn y .d´1d´2d´3 ... d´k b2 .b3... bn 8 0.x * 2 * 2 * 2 * 2 0.xy 0 1 0 1 * 2 * 2 Exemplo de conversão 0.625 = 0.b1b2b3... bn 1 .25 b1 .b2b3... bn 0.25 = 0.b2b3... bn 0 .5 b2 .b3... bn 0.5 = 0.b3... bn 1 .0 b3 .b4... bn • 0.101 = 1 * 2-1 + 1 * 2-3 = 1/2 + 1/8 = 5/8 = 0.625 9 0.1 * 2 * 2 * 2 0.10 * 2 * 2 * 2 0.101 Limitações da Representação • Com codificação de tamanho finito a notação decimal não pode representar números como 1/3 ou 5/7 – não podem ser escritos como • Da mesma forma, a notação binária somente pode representar números escritos como – 1/8 (= 0.125) 0.0012 – 5.625 (= 45/8) 101.1012 • Outros números devem ser aproximados – parte fracionária possui sequências repetidas indefinidamente – quanto maior a representação binária (parte fracionária), maior a acurácia (precisão) 10 b k ⋅ 2 k k = - n m ∑ d k ⋅ 10 k k = - n m ∑ 0.2 * 2 = 0 .4 0.4 * 2 = 0 .8 0.8 * 2 = 1 .6 0.6 * 2 = 1 .2 0.2 * 2 = 0 .4 0.4 * 2 = 0 .8 Utilizando o algoritmo de conversão 0.0011 0011 0011... . . . 11 Representação IEEE 754 • Notação posicional não é adequada para números muito grandes ou próximos de 0 – sequências muito grandes de bits • A idéia é representar o número na forma x * 2 y → para um par adequado de valores (x,y) – para obter a melhor precisão • Define três precisões: – Single precision (float) 32 bits (precisão 24 bits) – Double precision (double) 64 bits (precisão 53 bits) – Double extended precision 80 bits (precisão 63 bits) • esta última em arquiteturas Intel Pentium e 68000 12 • Forma numérica (–1)s M 2E – Bit de sinal s determina se número é negativo ou positivo – Mantissa M é um valor fracionário 1 <= M < 2 – Expoente E especifica potência positiva ou negativa de 2 • Bit mais significativo é s → s = 1 : n° negativo, s = 0 : n° positivo • Campo exp codifica E • Campo frac codifica M 13 s exp frac Codificação Padrão IEEE: precisões – float (32 bits): exp = 8 bits, frac = 23 bits, s = 1 bit • faixa de valores: 2-126 até 2127 – double (64 bits): exp =11 bits, frac = 52 bits, s = 1 bit • faixa de valores: 2-1022 até 21023 – precisão estendida (80 bits): exp =15 bits, frac = 63 bits, s = 1 bit • faixa de valores: 2-16382 até 216383 • menos comum 14 s exp frac Padrão IEEE: representações • O valor codificado é dividido em 3 categorias, dependendo do valor de exp: – valor normalizado (mais comum) – valor denormalizado (exp == all 0´s) – valores especiais (exp = all 1´s) • Valor denormalizado (exp = 0): – representação de 0 (s = exp = frac = 0) – representação de números muito próximos a 0 (-1 < x < 1) • Valores especiais: – “infinito” e NaN (Not a Number) 15 Valores Normalizados M = 1 + frac → 1 é “implícito” (1 <= M < 2) • frac = 00…..0 → M = 1.0 • frac = 01010…0 → M = 1 + 1/4 + 1/16 = 1 + 5/16 = 1.3125 E = exp – Bias → representação “em excesso” – exp é um valor sem sinal e Bias = 2k-1 - 1 – float (precisão simples): Bias = 127 (28-1 – 1 = 27 – 1 = 128 – 1) – double(precisão dupla): Bias = 1023 (211-1 – 1 = 210 – 1 = 1024 – 1) precisão simples: precisão dupla: exp = 1 → E = 1 – 127 = -126 exp = 1 → E = 1 – 1023 = -1022 exp = 127 → E = 127 – 127 = 0 exp = 1023 → E = 1023 – 1023 = 0 exp = 254 → E = 254 – 127 = 127 exp = 2046 → E = 2046 – 1023 = 1023 16 s exp ≠ 0 & ≠ 1´s frac (–1)s M 2E Exemplo 1 (precisão simples) • float f = 15213.0; 1521310 = 111011011011012 = 1.11011011011012 * 2 13 • frac (23 bits) = 110110110110100000000002 • exp (8 bits) = E + Bias = 13 + 127 = 140 = 100011002 • s = 0 17 Binário 0100 0110 0110 1101 1011 0100 0000 0000 Hex: 4 6 6 D B 4 0 0 13 casas para a esquerda M E 0 10001100 11011011011010000000000 31 30 23 22 0 Exemplo 2 (precisão simples) • frac = 10000001110012 → M = 1.1000000111001 M = 1 + 1/2 + 1/256 + 1/512 + 1/1024 + 1/8192 = 1 + 4153/8192 • exp = 10001100 = 8C16 = 128 + 12 = 140 E = 140 – 127 = 13 • V = (-1)0 * (1 + 4153/8192) * 213 = ((8192 + 4153)/8192) * 8192 = 1234510 18 Hex: 4 6 4 0 E 4 0 0 Binário 0100 0110 0100 0000 1110 0100 0000 0000 0 10001100 10000001110010000000000 31 30 23 22 0 Exemplo 3 (precisão dupla) • double d = 178.125; 178.12510 = 178 + .125 = 178 + 1/8 = 128 + 32 + 16 + 2 + 2-3 = 10110010.0012 = 1.01100100012 * 2 7 • frac (52 bits) = 0110010001000…0002 • exp (11 bits) = E + Bias = 7 + 1023 = 1030 = 100000001102 • s = 0 19Binário 0100 0000 0110 0110 0100 0100 0000 0000 … 0000 Hex: 4 0 6 6 4 4 0 0 00 00 00 00 7 casas para a esquerda M E 0 10000000110 0110010001000000…0000 63 62 52 51 0 Valores Especiais • “infinito”: permite representação de overflow – multiplicação, divisão por 0 • NaN (Not a Number) – operações que não tem número real como resultado (√-1 , ∞ - ∞) – pode ser usado para representar dados não inicializados • em C: macros em <math.h> 20 zero S= 0 exp = 0 M = 0 + ∞ S=0 exp=111...111 M = 0 - ∞ S=1 exp=111...111 M = 0 NaN(*) S exp=111...111 M ≠ 0 Valores Denormalizados – representação de 0 e números muito próximos de 0 M = frac → não tem 1 “implícito” (0 <= M < 1) E = 1 – Bias 21 s exp = 0 frac (–1)s M 2E
Compartilhar