Organização de Computadores I - 2008.2

Laboratório 2 - Representação em ponto flutuante

Aqueles que me entregarem o relatório respondendo as perguntas 1 a 7 deste laboratório até terça-feira, dia 09/09/2008, poderão receber até 0,5 adicionais na nota da P1

Neste laboratório, veremos como a representação em ponto flutuante, por ser inexata, pode fornecer resultados inesperados a um usuário. Para isso, utilizaremos alguns programas em C. A seguir, serão descritos os passos a serem seguidos para realização deste laboratório:

  1. Salve em um diretório os seguintes arquivos: f01.c , f02.c , finex.c, fins.c e conv1.c Você irá compilar e executar estes arquivos utilizando o compilador gcc. Para entrar neste ambiente execute os seguintes passos:
    1. Clique no ícone do Gcc
    2. Uma janela DOS será aberta. Vá para o diretório onde voce salvou os arquivos acima com o comando
       cd diretório 
    3. Para compilar o seu programa voce deve digitar o seguinte comando
       gcc -o nome_do_executavel nome_do_arquivo_fonte 
    4. Para executar o seu programa voce deve digitar o nome do seu programa executável na linha de comando.

    Observação

    Em C, o tipo float é utilizado para representação em ponto flutuante padrão IEEE 754 precisão simples e o tipo double para precisão dupla.

  2. Analise o programa f01.c mostrado abaixo:
    #include 
    
    int main ()
    {
            float x=0.01;
            if ((x*100.0) != 1.0)
                    printf ("Não iguais \n");
            else
                    printf ("Iguais \n");
            return(0);
    }
    
    
    PERGUNTA 1: O que você espera que seja impresso?

    PERGUNTA 2: Execute o programa e verifique o que acontece. Era o que você esperava ?

    Compile e execute o programa f02.c abaixo:

    #include 
    
    int main ()
    {
            float x=0.01;
            x=x*100.0;
            if (x != 1.0)
                    printf ("Não iguais \n");
            else
                    printf ("Iguais \n");
            return(0);
    }
    

    PERGUNTA 3: Execute o programa e verifique o que acontece. Apresentou o mesmo comportamento de f01.c ? Explique o comportamento destes programas.

    DICA: No processador Pentium, quando uma operação aritmética é executada em ponto flutuante, os operandos são colocados em registradores de 80 bits, com 64 bits para a mantissa, 15 bits para o expoente e 1 bit para sinal. Lembre-se que para armazenar uma variável do tipo float, utilizam-se 32 bits, 23 bits para mantissa, 8 bits para expoente e 1 bit para sinal.

  3. Analise o arquivo finex.c abaixo:
    #include "stdio.h"
    
    int main () {
    
            float X,Y,Y1,Z,Z1;
            X=77777;
            Y=7;
            Y1=1/Y;
            Z=X/Y;
            Z1=X*Y1;
            printf ("Z %f Z1 %f \n", Z, Z1);
            if (Z==Z1)
                    printf ("Z %f Z1 %f iguais \n",Z,Z1);
            else
                    printf ("Z %f Z1 %f diferentes \n",Z,Z1);
            return(0);
    }
    

    PERGUNTA 4: O que você acha que deve ser impresso na execução deste programa ?

    PERGUNTA 5: Compile e execute o programa. O resultado é o que você esperava? Porque ?

  4. Analise o programa fins.c abaixo e conclua o que deve ser impresso. Depois execute o programa e verifique se foi impresso o que você esperava.
    #include "stdio.h"
    int main () {
            float X,Y;
            X=1000.2;
            Y=X-1000.0;
            printf ("Y =%f \n",Y);
            return(0);
    }
    

  5. No programa conv1.c, uma variável do tipo float é convertida para o tipo int. Execute o programa e verifique o seu resultado.

    PERGUNTA 6: Explique se era o que você esperava.

    Insira a linha printf("Float Y = %f \n",Y), após o comando printf no arquivo conv1.c. Execute novamente o programa.

    PERGUNTA 7: Agora você consegue entender o que aconteceu ? Explique porque.