Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [c] calcolo valore double dal binario

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Nessuno che perde 5 minuti per controllarlo? :P

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.