INF1018 - Software Básico

Aulas de Laboratório

Representação de Números com Ponto Flutuante

O objetivo deste laboratório é implementar operações sobre números de ponto flutuante sem usar operações de ponto flutuante, isto é, operando diretamente sobre a representação binária desses números.

Como, em C, operações de manipulação de bits só são permitidas para valores do tipo inteiro, você pode utilizar uma union como a definida abaixo para obter a representação de bits de um float como um unsigned int e vice-versa (isto é, obter um valor float a partir de sua representação binária).

typedef union { 
  float f;
  unsigned int i;
 } U;
...
U u;
float f1 = ...;
unsigned int u1;

u.f = f1;  /* armazena o float na union */
u1 = u.i;  /* obtem a representação "manipulavel" do float */

...
u.i = u1;  /* armazena a representação binária na union */
f1 = u.f;  /* obtem o float correspondente a essa representação */

Algumas macros úteis:

Exercícios:

  1. Escreva uma função C float2 que, sem usar operações de ponto flutuante, multiplique o valor de seu parâmetro por 2:
       float float2(float f);
    

    Lembre-se de tratar casos especiais (por exemplo, 0 e overflow)!

  2. Escreva uma função C int2float que converta um número no formato int para o formato float:
       float int2float(int i);
    
    ATENÇÃO: Uma conversão direta, como i = (unsigned int)f, não vale, pois o C irá converter o formato, e a proposta do laboratório é você fazer a conversão...


Exercício extra:

Escreva uma função float2int, em C ou assembly, para converter um número no formato float para o formato int. Novamente, a função deve fazer a conversão sem usar operações de ponto flutuante.

O protótipo da função é:

   int float2int(float f);

Uma sugestão de main para testar suas funções de conversão: mainlab12.c