Sistemas de Computação Aritmética Computacional -Ponto Flutuante – Material originalmente elaborados pelo Prof. Dr. David Fernandes [email protected] Compilado a partir de slides preparados por Prof. MSc. Leandro Galvão [email protected] www.dcc.ufam.edu.br/~dcc_oc.html Frações binárias A parte fracionária (entre 0 e 1) de um número real em notação binária é representada por: bi 0 ou 1 0.b1b2b3 Portanto, seu valor em decimal (F) é dado por: 1 2 3 F (b1 2 ) (b2 2 ) (b3 2 ) A expressão anterior pode ser reescrita como: 1 1 1 1 2 F 2 b1 2 (b2 2 ) 2 (b3 2 ) 1 1 1 F 2 (b1 2 (b2 2 (b3 Frações binárias A expressão anterior sugere uma técnica de conversão. se multiplicarmos F por 2, teremos: 2 F b1 21 (b2 21 (b3 Da expressão acima, percebe-se que b-1 é a parte inteira do número (2 × F). Portanto, podemos afirmar que (2 × F) = b-1 + F1, onde 0 < F1 < 1, e: 1 1 F1 2 (b2 2 (b3 Para encontrar b-2, basta repetir o processo. Frações binárias Assim, o processo de conversão da fração F de decimal para binário envolve repetidas multiplicações por 2. A cada passo, a parte fracionária do resultado do passo anterior é multiplicada por 2. Os dígitos da parte inteira serão 0 ou 1 (da definição de bi), contribuindo para a formação da representação binária. Frações binárias O processo anterior não é necessariamente exato: Uma fração decimal com número finito de dígitos pode corresponder a uma fração binária com um número infinito de dígitos. Nesses casos, o algoritmo de conversão é suspenso após um número pré-estabelecido de passos, dependendo da precisão desejada. Escolha da notação Com a notação de complemento de 2, podemos representar a parte inteira de números reais. Com a notação fracionária, podemos representar a parte fracionária do mesmo número real. Limitações: números muito grandes não podem ser representados números muito pequenos não podem ser representados dificuldades para manter precisão durante realização de operações aritméticas Ponto flutuante (Padrão IEEE 754) Um número real pode ser representado no seguinte formato: (-1)s × m × Be s m B e – – – – sinal mantissa base (implícita, não representada) expoente Ponto flutuante (Padrão IEEE 754) O formato de precisão simples (float) ocupa 32 bits. 1 bit 8 bits 23 bits sinal expoente fração O formato de precisão dupla (double) ocupa 64 bits. 1 bit 11 bits 52 bits sinal expoente fração Ponto flutuante (Padrão IEEE 754) :: Sinal O bit mais à esquerda guarda o sinal do número: bit = 0 número positivo bit = 1 número negativo Ponto flutuante (Padrão IEEE 754) :: Fração A mantissa é representada na forma normalizada (base binária): 1.b1b2b3 A mantissa é composta por: Algarismo 1 Ponto de separação Fração Ponto flutuante (Padrão IEEE 754) :: Fração O algarismo 1 e o ponto de numeração não precisam ser armazenados, pois são os mesmos para todos os números reais representados. Caso a fração possua menos bits que o esperado, zeros devem ser colocados à direita, pois não têm significância. 23 bits fração = 1,110011 11001100000000000000000 fração Ponto flutuante (Padrão IEEE 754) :: Fração Por razões históricas, o co-processador de ponto flutuante Intel não utiliza parte inteira implícita, ou seja, a parte inteira também é representada juntamente com a fração. O formato de precisão estendida ocupa 80 bits. 1 bit 15 bits 64 bits sinal expoente mantissa Ponto flutuante (Padrão IEEE 754) :: Expoente O expoente é representado na notação deslocada, ou excesso de N Maior expoente representável: 2n-1 Representado por: 11...11 Menor expoente representável: -(2n-1 - 1) Representado por: 00...00 Ponto flutuante (Padrão IEEE 754) :: Notação excesso de N Decimal Complemento de dois Notação excesso de N +4 -- 111 +3 011 110 +2 010 101 +1 001 100 0 000 011 -1 111 010 -2 110 001 -3 101 000 -4 100 -- Ponto flutuante (Padrão IEEE 754) :: Notação deslocada Representação do valor zero: 01...11. Representação do valor um: 10...00. Demais valores: somar ao zero (deslocamento). Ponto flutuante (Padrão IEEE 754) Exemplo: (10)bin = +1.0 × 21 1 bit 0 sinal 8 bits 1000 0000 expoente 23 bits 0000 0000 0000 0000 0000 000 fração Ponto flutuante (Padrão IEEE 754) Mais exemplos: fração em binário float expoente não sinalizado fração em decimal expoente decimal Ponto flutuante × Ponto fixo :: Faixa de números representados Inteiros representados -231 overflow negativo underflow negativo underflow positivo números representados - (1 - 2-24) × 2128 231 - 1 0 - 2-127 números representados 0 2-127 overflow positivo (1 - 2-24) × 2128 Ponto flutuante :: Zero Como representar o zero em ponto flutuante? Adota-se uma convenção. 0 sinal 00000000 expoente 0000000000000000000000 fração 1 sinal 00000000 expoente 0000000000000000000000 fração +0 –0 Ponto flutuante :: Infinito Notação especial para representar eventos incomuns: permite que os programas possam manipulá-los sem que sejam interrompidos. 0 sinal 11111111 expoente 0000000000000000000000 fração +∞ 1 sinal 11111111 expoente 0000000000000000000000 fração -∞ Ponto flutuante :: NaN – Not a Number É uma representação do resultado de operações inválidas, tais como: 0/0 ∞-∞ ∞/∞ 0×∞ √x, x < 0 x sinal 11111111 expoente xxx...xx ≠ 0 fração Código ASCII (texto) ASCII American Standard Code for Information Interchange A primeira versão foi criada em 1963 para normalizar a transmissão e armazenamento de texto. Em 1967 foram incluídas as letras minúsculas no código, que essencialmente permaneceu inalterado até nossos dias. Código ASCII Código ASCII 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 ! “ # $ % & ‘ ( ) * + , . / 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 @ A B C D E F G H I J K L M N O 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 P Q R S T U V W X Y Z [ \ ] ^ _ 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ` a b c d e f g h i j k l m n o 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 p q r s t u v w x y z { | } ~ DEL UNICODE O código ASCII possui a grande desvantagem de apenas permitir a representação de 28=256 símbolos diferentes. O código UNICODE pretende normalizar a codificação dos caracteres utilizados em todas as escritas do mundo. Utiliza 16 bits para codificar cada caracter e encontra-se disponível nos sistemas informáticos mais recentes. Mais informações em http://www.unicode.org Para saber mais... William Stallings. Computer Organization and Architecture: Designing for Performance. 7th Ed. Prentice Hall, 2005. Cap. 09. Patterson & Hennessy. Organização e Projeto de Computadores (Interface HW/SW). Cap. 3. Sivarama P. Dandamudi. Guide to Assembly Language Programming in Linux. Springer, 2005. Cap. 22. Kip R. Irvine. Assembly Language For Intel-Based Computers. 5th Edition. Prentice Hall, 2006. Cap. 17. Questões