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,m) ((s & 1)<<31 | (((e) & 0xff) << 23) | ((m) & 0x7fffff))
#define getsig(x) ((x)>>31 & 1) #define getexp(x) ((x)>>23 & 0xff) #define getmant(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);
Lembre-se de tratar casos especiais (por exemplo, 0 e overflow)!
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...
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