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:
#define makefloat(s,e,f) ((s & 1)<<31 | (((e) & 0xff) << 23) | ((f) & 0x7fffff))
#define getsig(x) ((x)>>31 & 1) #define getexp(x) ((x)>>23 & 0xff) #define getfrac(x) ((x) & 0x7fffff)
float2
que, sem usar operações de ponto flutuante,
multiplique o valor de seu parâmetro por 2:
float float2(float f);
DICA: se você tem a representação de um valor na forma
x * 2y
, qual é o novo valor
de y
se você multiplicar esse valor por 2?
int2float
que converta um número no formato int
para o formato float
.
ATENÇÃO: Uma conversão direta, como f =
(float)i
, não vale,
pois o C irá converter o formato, e a proposta do laboratório é você fazer a
conversão...
O protótipo da sua função é
float int2float(int i);
DICAS:
Uma sugestão de main
para testar suas funções de conversão
está aqui