PDA

Visualizza la versione completa : [c] calcolo valore double dal binario


Eduadie
29-05-2013, 19:52
Avrei un problema riguardo il calcolo di un valore di un numero double con dei bit generati a caso.
Credo che la parte della generazione random dei bit sia giusta ma quando cerco di calcolare il valore del double mi escono numeri sballatissimi.
La traccia dell'esercizio è nel codice, mi serve la prima parte cioè fino al valore del numero double ricavato dal binario casuale...L'altra parte poi ci penserò con calma :)



/* SLIDE 7 - ESERCIZIO 3
TRACCIA
Generando in modo random i bit di una variabile di un numero reale x (double x), determinare i bit della corrispondente variabile flx (float fl
flx=(float) x. Se il numero x è rappresentabile nel tipo float calcolarne l'errore assoluto e relativo (considerando come esatto il double e come
approssimante il float x) dalle formule.
*/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define NBIT_DOUBLE 64

void genera_bitdouble (int bit[]);
int calcola_esponente (int bit[], int inizio, int fine);
double calcola_mantissa (int bit[], int inizio, int fine);
void binario_float (long int numero);

union ffloat
{
float a;
long int la;
} flx;

int main()
{
double x;
short int azione;
int bit[NBIT_DOUBLE];
double esponente, mantissa;
printf("Programmazione II - Esercizio 16\n\n");

do
{
printf("Premi 1 per generare in modo casuale i bit di una variabile double = ");
scanf("%hd", &azione);
} while (azione != 1);

printf("\nBinario DOUBLE generato\n");
srand((unsigned int)time(0));
genera_bitdouble(bit);

esponente = calcola_esponente (bit, 1, 11) - 1023;
mantissa = calcola_mantissa(bit, 12, 63);

if(bit[0] == 0)
{
x = mantissa * (double)pow(2, esponente);
} else
{
x = mantissa * (double)pow(2, esponente)*-1;
}

printf("Valore = %e", x);

flx.a = (float)x;

printf("\nValore = %e", flx.a);

binario_float(flx.la);

if(esponente > -127 && esponente < 128)
{
printf("\nERRORE ASSOLUTO = %e\n", fabs(x-flx.a));
printf("ERRORE RELATIVO = %e\n", fabs(x-flx.a)/fabs(x));
printf("\nIl valore DOUBLE e' rappresentabile come FLOAT\n");
} else
{
printf("\n\nIl valore DOUBLE non e' rappresentabile come FLOAT\n");
}

return 0;
}
void genera_bitdouble (int bit[])
{
short int i;
for(i=0;i<NBIT_DOUBLE;i++)
{
if(i==1 || i==12)
printf(" ");
bit[i] = rand() % 2;
printf("%d", bit[i]);
}
printf("\n");
}
int calcola_esponente (int bit[], int inizio, int fine)
{
int valore=0, e, i;

e=fine-inizio; //Valore massimo dell'esponente

for(i=inizio;i<=fine;i++)
{
if(bit[i]==1)
{
valore += pow(2,e);
}
e--;
}
return valore;
}
double calcola_mantissa (int bit[], int inizio, int fine)
{
double valore=1.0f, potenza;
int i;

potenza=0.5f; //Valore di 2^-1
for(i=inizio;i<=fine;i++)
{
if(bit[i] == 1)
{
valore += potenza;
}
potenza /= 2;
}
return valore;
}
void binario_float (long int numero)
{
short i;

printf("\n\nBinario FLOAT del numero generato DOUBLE\n");
for(i=0;i<32;i++)
{
if(i==1 || i==9)
printf(" ");
printf("%ld", (numero>>(31-i))&1);
}
}


EDIT: Ho provato a modificarlo mi escono dei numeri un pò piu leggibili anche se altissimi o piccolissimi...Ma l'algoritmo è corretto?

EDIT2: Credo di essere arrivato ad un buon livello dell'algoritmo...dovrebbe essere funzionante...Potete darci un occhiatina? Mi interessa sapere solo se è giusto, poi già so che magari potrebbe migliorare, questo lo posso fare pian piano :)

Eduadie
30-05-2013, 19:54
Nessuno che perde 5 minuti per controllarlo? :P

Loading