Fundamentos de Arquiteturas de Computadores

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

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
  2. 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 
    1. Para compilar o seu programa voce deve digitar o seguinte comando
 gcc -o nome_do_executavel nome_do_arquivo_fonte 
    1. 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.

  1. Analise o programa f01.c mostrado abaixo:
4.   
5.  #include 
6.   
7.  int main ()
8.  {
9.          float x=0.01;
10.        if ((x*100.0) != 1.0)
11.                printf ("Não iguais \n");
12.        else
13.                printf ("Iguais \n");
14.        return(0);
15.}
16. 

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.

  1. Analise o arquivo finex.c abaixo:
18. 
19.#include "stdio.h"
20. 
21.int main () {
22. 
23.        float X,Y,Y1,Z,Z1;
24.        X=77777;
25.        Y=7;
26.        Y1=1/Y;
27.        Z=X/Y;
28.        Z1=X*Y1;
29.        printf ("Z %f Z1 %f \n", Z, Z1);
30.        if (Z==Z1)
31.                printf ("Z %f Z1 %f iguais \n",Z,Z1);
32.        else
33.                printf ("Z %f Z1 %f diferentes \n",Z,Z1);
34.        return(0);
35.}

 

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 ?

  1. 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.
37. 
38.#include "stdio.h"
39.int main () {
40.        float X,Y;
41.        X=1000.2;
42.        Y=X-1000.0;
43.        printf ("Y =%f \n",Y);
44.        return(0);
45.}

 

  1. 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.