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

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);
    }
}
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