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
EDIT: Ho provato a modificarlo mi escono dei numeri un pò piu leggibili anche se altissimi o piccolissimi...Ma l'algoritmo è corretto?codice:/* 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); } }
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![]()


Rispondi quotando